След година на разработка, новата стабилна версия на СУБД 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 (Обобщен инвертиран индекс), който се използва за индексиране на сложни стойности, като масиви, и за организиране на търсене по пълнотекстови данни или структури JSON.
- Добавена е възможност за създаване на материализирани представяния и ключове за секциониране на таблици с уникални индекси, които не използват структура 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 за промяна на регистра на символите с оглед на свойствата на локализация „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.
Източник: opennet.ru
