25 сентября 2025 года состоялся релиз стабильной версии СУБД PostgreSQL 18. Обновления для новой ветки будут выходить в течение пяти лет до ноября 2030 года. Подготовка к выпуску PostgreSQL 18 проходила в рамках годового цикла разработки проекта. Поддержка PostgreSQL 13.x, самой старой из поддерживаемых веток, будет прекращена 13 ноября 2025 года.
По данным OpenNET, основные изменения и дополнения в PostgreSQL 18:
добавлена подсистема асинхронного ввода/вывода, позволяющая увеличить пропускную способность ввода/вывода и избавиться от задержек. Помимо доступной на всех платформах универсальной реализации 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.
Источник: habr.com