Релиз СУБД PostgreSQL 18

После года разработки опубликована новая стабильная ветка СУБД 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.



Источник: http://www.opennet.ru/opennews/art.shtml? num=63877

© OpenNet