После года разработки опубликована новая стабильная ветка СУБД PostgreSQL 18. Обновления для новой ветки будут выходить в течение пяти лет до ноября 2030 года. Поддержка PostgreSQL 13.x, самой старой из поддерживаемых веток, будет прекращена 13 ноября.
Основные новшества:
- Добавлена подсистема асинхронного ввода/вывода, позволяющая увеличить пропускную способность ввода/вывода и избавиться от задержек. Помимо доступной на всех платформах универсальной реализации AIO (io_method=worker), основанной на выполнении нескольких процессов-обработчиков (по умолчанию 3), в Linux может применяться интерфейс асинхронного ввода/вывода io_uring (io_method=io_uring), поддерживаемый начиная с ядра Linux 5.1. Асинхронный ввод/вывод пока задействован только для ускорения выполнения некоторых операций, связанных с чтением данных из файловой системы, таких как последовательный перебор, сканирование битовой карты индексов и проведение чистки (vacuum). В некоторых тестах применение AIO приводит к увеличению производительности в 2-3 раза. Операции записи продолжают выполняться в синхронном режиме для достижения требований ACID.
- Реализована оптимизация “skip scan” в многостолбцовых индексах, благодаря которой индекс может использоваться не только для проверки первого проиндексированного столбца и полной связки столбцов, но и для обработки по отдельности остальных проиндексированных столбцов. Например, ранее при создании B-tree индекса над столбцами “(status, date)” индекс применялся только для запросов, проверяющих поле “status” или оба поля “status” и “date”, а при проверке в запросе только поля “date” выполнялось сканирование содержимого таблицы. Режим “skip scan” позволяет в определённых ситуациях сканировать индекс при запросе только поля “date”. Режим применяется только для индексов “B-tree” при использовании в запросе условного оператора “=” над индексированным полем, в ситуациях, когда пропущенное поле имеет небольшое количество различных значений (например, оптимизация сработает, если поле статус “status” имеет несколько фиксированных значений).
- Добавлены оптимизации, более эффективно использующие индексы для запросов, содержащих конструкции “OR” и “IN (…)” в блоке “WHERE”, а также повышающие производительность планирования и выполнения объединения таблиц (например, ускорен код слияние хэшей и разрешено использовать инкрементальную сортировку при слиянии таблиц).
- Добавлена поддержка распараллеливания построения индексов GIN (Generalized Inverted Index), применяемых для индексации составных значений, таких как массивы, и организации поиска по полнотекстовым данным или структурам JSON.
- Добавлена возможность создания материализованных представлений и
ключей для секционирования таблиц с индексами с признаком “unique”, не использующими структуру B-tree. - Повышена общая производительность блокировок для запросов, работающих с большим количеством таблиц, а также внесены улучшения в обработку запросов к секционированным таблицам, ускоряющие отсеивание не используемых секций и операции слияния (JOIN).
- Ускорены операции с текстом, такие как функции приведения в верхний/нижний регистр. Добавлен режим PG_UNICODE_FAST для ускорения учёта свойств локали Unicode-символов.
- Реализована возможность сохранения статистики планировщика запросов после обновления между значительными релизами PostgreSQL. Изменение позволяет избежать выполнения ресурсоёмкой операции “ANALYZE” после запуска новой версии, до завершения которой наблюдается проседание производительности СУБД.
- Повышена производительность утилиты pg_upgrade, применяемой для автоматизации перехода на новый значительный выпуск PostgreSQL. Оптимизации особенно заметны при обновлении БД, содержащих большое число объектов, таких как таблицы и последовательности. Для ускорения работы pg_upgrade также добавлен флаг “–jobs N” для распараллеливания проверок в N потоков и флаг “–swap” для замены каталогов с данными целиком без выставления ссылок, клонирования и копирования файлов.
- Добавлена поддержка виртуальных генерируемых столбцов, значение которых вычисляется на лету в процессе выполнения запросов, без сохранения на диск. Если в выражении “CREATE TABLE…” для генерируемых столбцов указано только ключевое слово “GENERATED” без уточнения типа (STORED или VIRTUAL), то новый вариант применяется по умолчанию вместо старой реализации. В старой реализации значения генерировались во время выполнения операций “INSERT” или “UPDATE” и сохранялись на диск для последующего использования. Недостатком виртуальных генерируемых столбцов является невозможность использования их в индексах, а достоинством – возможность выполнять нормализацию и изменение данных на лету (актуально при работе с данными JSON).
Что касается классических хранимых генерируемых столбцов, то в новом выпуске для них обеспечена поддержка логической репликации. - В командах INSERT, UPDATE, DELETE и MERGE реализована возможность вывода прошлых (OLD) и текущих (CURRENT) значений в выражении RETURNING. Например, “UPDATE… RETURNING WITH (OLD AS o, NEW AS n) o.*, n.*.”.
- Добавлена функция uuidv7() для генерации случайных уникальных идентификаторов в формате UUIDv7. В отличие от старой функции для генерации UUID (gen_random_uuid), которая теперь дополнительно доступна под именем uuidv4(), в UUIDv7 помимо случайного значения включается время генерации. Наличие упорядоченных частей в значении UUID (первые 12 символов – эпохальное время, а последующие 18 – случайное значение) повышает эффективность сортировки и индексирования, что актуально так как UUID обычно используются для первичных ключей (например, ключи, созданные в близкое время размещаются рядом друг с другом в индексе).
- В операции “LIKE” реализована поддержка сопоставлений с текстом, в котором используются недетерминированные свойства локали “collation”, позволяющие выполнять сопоставления с учётом смысла символов (например, при сравнении может не принимается во внимание знак ударения). Добавлена функция CASEFOLD для изменения регистра символов c учётом свойств локали “collation” (например, некоторые символы имеют более двух строчных вариантов или при сравнении требует преобразования в верхний регистр, а не в нижний).
- Добавлена возможность использования временных ограничений (temporal constraint). В значениях “PRIMARY KEY” и “UNIQUE” для добавления временных ограничений следует использовать выражение “WITHOUT OVERLAPS”, а в значении “FOREIGN KEY” – выражение PERIOD. Например, при определении первичных ключей можно ограничить ключи с перекрывающимися интервалами времени.
- Добавлена команда “CREATE FOREIGN TABLE … LIKE command” для создания схемы внешней таблицы на основе определения локальной таблицы.
- Добавлена поддержка подключения к СУБД, используя аутентификацию на базе OAUTH 2.0 с применением токена доступа вместо пароля. Применение OAUTH позволяет не хранить пароли в БД, а идентифицировать пользователей через внешние сервисы, а также использоваться такие возможности как двухфакторная аутентификация и единая точка входа (SSO).
- Добавлена функция ssl_tls13_ciphers(), через которую можно определить список алгоритмов шифрования, допустимых при подключении с использованием протокола TLSv1.3.
- В разряд устаревших и запланированных к удалению переведена поддержка аутентификации с использованием алгоритма md5 для хэширования паролей. Вместо md5 рекомендуется применять алгоритм SCRAM (SCRAM-SHA-256), появившийся в PostgreSQL 10. Дополнительно отмечается реализация поддержки проброса аутентификации на базе SCRAM при подключении через postgres_fdw и dblink к внешним серверам PostgreSQL.
- При выполнении операции “EXPLAIN ANALYZE” обеспечен вывод сведений о числе операций поиска в индексах при сканировании индекса и числе обращений к буферам при выполнении запроса. В вывод “EXPLAIN ANALYZE VERBOSE” включена статистика о CPU, WAL-журнале и интенсивности операций чтения. В таблицу pg_stat_all_tables добавлены сведения о времени, потраченном на операцию VACUUM и анализ таблиц. Предоставлена статистика об интенсивности ввода/вывода и нагрузке на WAL-журнал в разрезе отдельных соединений. В pg_stat_subscription_stats и логах добавлена информация с диагностикой конфликтов при выполнении операций записи во время логической репликации.
- В новых установках включено по умолчанию использование контрольных сумм для проверки целостности хранимых данных. Для отмены данного поведения при запуске initdb следует указать опцию “–no-data-checksums”.
- В утилиту pg_createsubscriber добавлен флаг “–all” для создания логических реплик одной командой сразу для всех БД.
- Реализована новая версия (3.2) протокола, применяемого для взаимодействия внешних утилит с СУБД и реализованного в библиотеке libpq. Прошлое обновление протокола было произведено в PostgreSQL 7.4 (2003 год). В библиотеке libpq по умолчанию продолжает использоваться версия 3.0.
Release.
Ссылка here.