Секционирование таблиц PostgreSQL появилось еще в десятой версии продукта, и с тех пор оно только развивается. К примеру, уже в 11-й версии начало проводиться секционирование по хешу и секции. Легче стало перемещать запись в необходимую секцию, исключать или добавлять секции и т.д.
Как вы помните, PostgreSQL — это свободная Система Управления Базой Данных, в простонародье — СУБД. Активно стала развиваться последние 17 лет и представляет собой серьезную альтернативу многим коммерческим СУБД (Oracle, Microsoft SQL и др.). PostgreSQL можно реализовать на различных платформах:
- Линукс во всем его многообразии;
- Mac OS;
- WIN32;
- FreeBSD и др.
Самой сильной стороной данной СУБД является ее уникальная архитектура, позволяющая ее применение в варианте пользователь-сервер. Наверное, поэтому PostgreSQL достигла такой популярности.
Сегодня мы отметим ряд преимуществ, которые нам дает секционирование в PostgreSQL 12.
Производительность «COPY»
До 12-й версии PostgreSQL использовать «copy» в таблицу можно было только по одной строке. Теперь же данный оператор поддерживает массовые вставки в таблицу.
Проводя тест с кодом «copy», получили следующие результаты: когда увеличивается количество секций, работа кода притормаживается. Но в то же время при уменьшении количества строк на раздел, код ускоряется. Снижение скорости связано с тем, что для каждой строчки «copy» может предоставить до 999 слотов.
Производительность «INSERT»
В PostgreSQL 12 секционирование улучшилось и за счет повышения производительности «вставки». В прежних версиях, когда выполнялся «insert» в таблицу, все ее разделы блокировались, независимо от того, работали они в данный момент или нет. В новой версии СУБД все по-другому.
В новой PostgreSQL 12 блокирование секции происходит прямо перед тем, как в нее вставляется запись. То есть при добавлении одной строки блокируется только одна секция, а не как раньше — все. Именно поэтому секционирование в PostgreSQL 12 стало более производительным. Особенно это заметно, когда у нас большое количество секций в таблице, а вставлять нужно только одну строчку.
Производительность «SELECT»
Со времен внедрения секционирования в PostgreSQL «выборка» претерпела ряд изменений, и окончательно улучшилась ее производительность только в 12-й версии:
- В PostgreSQL 10 каждая секция проверялась последовательно на наличие ограничений и необходимой информации.
- В PostgreSQL 11 пошли немного дальше и добавили исключение секций, в которых нет необходимости.Немного ускорилась работа, но все равно выполнялись ненужныедействия— прогружались метаданные абсолютно всех секций: и нужных, и ненужных;
- В PostgreSQL 12 все исправили, теперь метаданные загружаются только после полного исключения ненужных секций, и производительность улучшилась.
Особенно заметны изменения в скорости работы, когда у вас большое количество разделов и секций.
Секционирование PostgreSQL 12 и его улучшения
В PostgreSQL 12 было внедрено еще несколько интересных, но, возможно, не столь важных улучшений, о которых тоже нужно рассказать. Некоторые из них:
- Упорядочено сканирование разделов. В новой версии данной СУБД сканирование разделов может производиться в неявном порядке по методу LIST или RANGE. При данном решении отсутствуют бесполезная сортировка и сравнение.
- Можно избавиться от плана Append и MergeAppend. Избавление от них дает небольшой прирост в производительности.
- Другие изменения: возможность исключить разделы прямо во время выполнения, добавлена инструкция по манипулированию битами, ряд изменений внесен в «executor», улучшено использование метода «Range» и мн.др.
Как видно из описанного выше, секционирование в PostgreSQL 12 действительно было улучшено, если сравнивать с прежними версиями данной СУБД. Поэтому имеет смысл переходить на эту версию, тем более если работа с базой у вас предполагает наличие большого количества секций и разделов.
Другое