Улучшен планировщик. Так же как постоянно улучшается crypt пакет в Go, также регулярно обновляется и улучшается планировщик в PostgreSQL. На практике это обозначает, что даже если запрос выстроен неоптимально, то некоторые неоптимальности смогут быть преодолены на этапе планирования выполненеия запроса. Добавлено:
Добавлена поддержка skip scan
составных индексов. Напомню что такое составной индекс. Представим
заказ, у которого есть ID покупателя и дата. Если мы часто делаем запросы на выборку заказов для конкретного
покупателя и датой больше определенного значения, например за последние 3 месяца, то можно добавить составной
индекс, т.е. в индексе будет как ID покупателя, так и дата заказа. Фильтрация будет работать быстрее.
Однако, если мы захотим выбрать заказы старше какой-то даты, например, за последние три месяца для всех
клиентов, то индекс не будет использован. В PostgreSQL 18, благодаря skip scan, такой индекс всё же может быть
использован, если клиентов не слишком много.
Добавлена параллельное построение GIN-индекса. Построение GIN-индекса для одних и тех же данных всегда занимает больше времени, чем дефолтный BTree. Теперь GIN-индекс будет строится параллельно на нескольких ядрах.
Улучшено отсеивание (pruning) партиций на этапе планирования. Когда используем партицирование (от слова part - часть)? Классический пример - таблица логов, когда для каждого месяца создаем отдельную партицию. До 18 версии PostgreSQL залезал во все партиции, читал их метаданные, провоцировал кратковременные блокировки. Благодаря улучшенному планировщику сейчас если ты сделаешь выборку по кокретному месяцу из таблицы логов, то будет обращение только к одной партиции, а остальные останутся нетронутыми. Это в целом ускоряет чтение данных из партицированной таблицы.
Оптимизирован механизм блокировок, если делаешь аналитический запрос из десятков таблиц.
Улучшен автовакум. Он теперь агресивнее замораживает строки. Что такое заморозка? В PostgreSQL есть механизм MVCC, про который мы делали выпуск. Каждая строка хранит диапазон видимости для транзакций с двумя значениями: xmin, xmax. Чтобы избежать постоянных сравнений по нижней границе xmin, ей назначают специальное значение, которое говорит, что значение очень старое и можно простым образом проверить видимость замороженной строчки. Чем больше замороженных данных, тем быстрее работают выборки в конкурентной среде. Оптимизация автовакуума в плане заморозки приведет к тому, что он будет агрессивнее морозить строки, а значит общая производительность СУБД в условиях конкурентной нагрузки вырастет.
Также повысили некоторые дефолтные значения для того, чтобы PostgreSQL агрессивнее потребляла ресурсы. Дефолтные настройки PostgreSQL всегда отличались консервативностью и по крайней мере несколько из них нужно всегда настраивать на сколько нибудь свежем железе: тот же shared_buffers, work_mem, maintanance_work_mem и т.д.
Генерируемый столбец (generated) - это колонка, значение которой вычисляется на основе данных других колонок. Например, стоимость товара с налогом или, например, надо перевернуть строку и проиндексировать, чтобы работало вхождение по окончанию через LIKE. Такие колонки stored по умолчанию до PostgreSQL 18. Сейчас они сделаны виртуальными по-умолчанию. Идея в том, чтобы сократить занимаемое место на дисках по-умолчанию.
Улучшенный RUTURNING. Наконец-то можно с помощью специальных имен old
и new
указать какие данные я хочу получить в ответ на UPDATE. Раньше надо было исхитрятаться с CTE. Похожий функционал
c old и new я встречал в триггерах MySQL и Oracle.
Поддержка недетерминированных (детерминированный = ясный, конкретный) коллаций (механизм сравнения) в LIKE. Недетерминированная коллация может игнорировать регистр, акценты. Так, 'straße' = 'strasse' в немецкой недетерминированной коллации.
Добавлен провайдер коллаций PG_UNICODE_FAST
позволяющий сортировать не по сложным правилам
естественных языков, а по кодпоинтам Unicode. Если тебе просто надо отсортировать быстро, например, для
построения индекса, то можно быстрее сделать это используя коллацию по кодпоинтам Unicode.
Добавлен WITHOUT OVERLAPS
модификатор для последней колонки композитного первичного ключа.
Т.е. без пересечений. Актуально, если используется тип tstzrange
(диапазон дат). Например,
приём у врача не может быть одновременно у двух пациентов в пересекающийся диапазон времени или дат.
Теперь можно простым модификатором WITHOUT OVERLAPS
добавить строгости.
Функция UUID_v7()
генерирует UUIDv7 с временной компонентой, которую можно использовать для
хронологической сортировки.
Есть два вида репликаций PostgreSQL - физическая и логическая. Обе работают на базе WAL (write ahead log), т.е. журнала предзаписи. В случае физической обновления WAL сразу транслируются реплике, а в случае логической транслируются команды изменения данных вроде INSERT, UPDATE. Формат таких логов содержит действие, целевую таблицу и данные (можно представить в JSON, есть для декодирования спец плагины). Логическая репликация позволяет выполнять репликацию, скажем только одной таблицы.
Добавлено автоматическое отключение физической реплики. Если реплика падает, то части (слоты) WAL журнала накапливаются на мастер-сервере безгранично. Это могло привести к сбоям главного сервера. В 18 версии данные WAL слоты накапливаются некоторое время, а потом дропаются. Реплику прийдется в этом случае пересоздавать заново.
И ускорена сама реплика. Теперь сервер-подписчик может выполнять транзакции параллельно, а не последовательно как было раньше. Особенно это должно дать ускорение при первоначальной синхронизации большой базы.
md5 хеш для паролей теперь deprecated! Переходите на sha256. Судя по всему поддержка md5 хеша пароля может быть отключена в следующих версиях.
oAuth 2.0 добавлена для аутентификации через Single Sign-On (от корпоративной системы или провайдера аутентификаций вроде Google/Github и т.д.). Для разработчика это обернется только тем, что нужно будет авторизовываться в СУБД по короткоживущему токену.
Улучшено шифрование TLS 1.3. По умолчанию в набор групп шифрования добавлена современная эллиптическая кривая X25519, которая обеспечивает высокую скорость и стойкость шифрования.
Контрольные суммы целостности данных включены теперь по-умолчанию. Такая контрольная сумма - это отпечаток, позволяющий проверить целостность страницы данных. Раньше эту опцию нужно было включать вручную. Чтобы активировать чексуммы на работающей системе её прийдется остановить и запустить специальную команду. Процесс обновления страниц памяти может занять много времени в зависимости от системы.
Расширения могут добавлять доп опции в EXPLAIN. Представим, что вы создали свой тип индекса или какой-то планировщик запросов: теперь можно реализовать кастомные параметры EXPLAIN, чтобы отображать специфичные детали вашего расширения при анализе запросов.