После года разработки опубликована новая стабильная ветка СУБД PostgreSQL 11. Обновления для новой ветки будут выходить в течение пяти лет до октября 2023 года. Основное внимание при подготовке новой ветки было уделено расширению функциональности в областях управления очень большими базами данных и разработки приложений для масштабируемой обработки больших данных.

Основные новшества:

  • Добавлена возможность применения JIT-компиляции (Just-in-Time) для ускорения выполнения некоторых выражений в процессе обработки SQL-запроса. Например, JIT применим для ускорения выполнения выражений внутри блоков “WHERE”, в выходных списках (target lists), агрегатных выражениях и проекциях. JIT также задействован для ускорения некоторых внутренних операций. Предложенный JIT-компилятор построен на основе наработок LLVM и для включения требует установки дополнительных зависимостей, связанных с LLVM. Включение осуществляется настройкой “jit = on” в файле конфигурации или командой “SET jit = on” в интерактивном сеансе;
  • Добавлен новый вид хранимых процедур, позволяющих использовать транзакции. Процедуры определяются с использованием синтаксиса SQL и позволяют использовать все средства управления транзакциями. Поддержка транзакций в процедурах даёт возможность создавать более продвинутые серверные обработчики, например, для пакетной загрузки данных. Для определения хранимых процедур с транзакциями добавлена новая команда CREATE PROCEDURE. Для выполнения процедуры используется команда CALL. К SQL-процедурам также можно обращаться из хранимых процедур на PL/pgSQL, PL/Perl, PL/Python и PL/Tcl;
  • Улучшения, связанные с секционированием (партицированием):
    • Реализована поддержка секционирования данных по хэшу, которая позволяет секционировать таблицы не только по диапазонам значений и спискам, но и по произвольным ключам.
    • Обеспечена корректная маршрутизация операций INSERT, UPDATE и COPY для секционированных таблиц, обрабатываемых с использованием модуля postgres_fdw (логически объединяет таблицы с нескольких серверов);
    • Представлена секция “catch-all”, которая используется по умолчанию для данных, не соответствующих ключу секции, и позволяет применять первичные ключи, внешние ключи, индексы и триггеры над секционированными таблицами.
    • Обеспечено автоматическое перемещение записей в корректную секцию, в случае изменения в записи ключа для выбора секции;
    • Увеличена производительность запросов при чтении данных из секций;
    • Добавлена возможность применения операции “upsert” (добавить-или-модифицировать) к секционированным таблицам, что позволяет упростить код приложений и снизить число сетевых запросов;
  • Проведена работа по увеличению производительности параллельной обработки запросов. Увеличена производительность распараллеливания операций последовательного сканирования и слияния хэшей. Добавлена возможности распараллеливания операций при выполнении команд “CREATE TABLE … AS”, “CREATE MATERIALIZED VIEW” и блоков UNION. В команду “CREATE INDEX” реализована параллельная обработка данных при построении индексов B-tree;
  • Обеспечена возможность обойтись без полной перезаписи таблицы при выполнении “ALTER TABLE … ADD COLUMN” при отличающемся от null значении столбца по умолчанию;
  • В “CREATE INDEX” добавлена опция INCLUDE для создания индексов-обёрток, включающих дополнительные столбцы;
  • В оконные функции добавлена поддержка всех опций “рамок окна” (window frame), определённых в стандарте SQL:2011, включая возможность использования RANGE для PRECEDING/FOLLOWING, режима GROUPS и опций исключения рамок;
  • В интерфейс командной строки в дополнение к штатной команде “\q” добавлены более привычные для новичков команды “quit” и “exit”.