След година на разработка, новата стабилна версия на СУБД PostgreSQL 14 е публикувана. Актуализации за новата версия ще излизат в продължение на пет години, до ноември 2026 г.
Основни нововъведения:
- Добавена е поддръжка на достъп до JSON данни чрез изрази, наподобяващи работа с масиви: SELECT (‘{ «postgres»: { «release»: 14 }}’::jsonb)[‘postgres’][‘release’]; SELECT * FROM test WHERE details[‘attributes’][‘size’] = ‘»medium»‘;
Подобен синтаксис е реализиран и за данни във формат ключ/стойност, предоставяни от типа hstore. Изходният синтаксис първоначално е реализиран с универсален фреймуърк, който в бъдеще може да бъде използван и за други типове. Пример за типа hstore: INSERT INTO mytable VALUES (‘a=>b, c=>d’); SELECT h[‘a’] FROM mytable; UPDATE mytable SET h[‘c’] = ‘new’;
- Семейството от типове за определяне на диапазони е разширено с нови типове „multirange“, позволяващи задаване на подредени списъци от непокриващи се диапазони от стойности. В допълнение към всеки съществуващ range-тип е предложен съответстващ multirange-тип; например, на типа „int4range“ отговаря „int4multirange“, а на „daterange“ — „datemultirange“. Използването на новите типове опростява оформлението на заявки, които манипулират сложни последователности от диапазони. SELECT ‘{[3,7), [8,9)}’::int4multirange; SELECT nummultirange(numrange(1.0, 14.0), numrange(20.0, 25.0));
- Внесени са оптимизации за повишаване на производителността на системи с висока натовареност, обработващи голям брой връзки. В някои тестове се наблюдава двукратен ръст на производителността.
- Повишена е ефективността на работа на индексите B-tree и е решен проблемът с разрастването на индексите при често обновление на таблиците.
- Добавена е поддръжка на клиентски режим с конвейерна (pipeline) обработка на заявки, реализиран на ниво libpq, който значително ускорява сценарии на работа с БД, свързани с извършването на голям брой малки операции за запис (INSERT/UPDATE/DELETE), чрез изпращане на следващата заявка, без да се чака резултата от предходната. Този режим също помага за ускоряване на работата при връзки с големи закъснения на доставката на пакети.
- Разширени са възможностите за разпределени конфигурации, включващи няколко сървъри PostgreSQL. В реализицията на логичната репликация се появи възможност за изпращане на транзакции, които са в процес на изпълнение, в потоков режим, което значително увеличава производителността на репликацията на големи транзакции. Освен това, логичното декодиране на данни, получавани по време на логичната репликация, е оптимизирано.
- В механизма за свързване на външни таблици Foreign Data Wrapper (postgres_fdw) е добавена поддръжка за паралелна обработка на заявки, която в момента е приложима само при свързване с други PostgreSQL сървъри. Освен това, в postgres_fdw е добавена поддръжка за добавяне на данни във външни таблици в пакетен режим и възможност за импортиране на секционирани таблици чрез указване на директивата „IMPORT FOREIGN SCHEMA“.
- Направени са оптимизации в реализацията на операцията VACUUM (събиране на мусор и опаковане на дисково хранилище). Добавен е аварийният режим на почистване („emergency mode“), който пропуска незначителни операции по почистване, ако се създадат условия за навлизане в втори цикъл на идентификатори на транзакции (transaction ID wraparound). Намалени са разходите за обработка на индекси във формат B-Tree. Значително е ускорено изпълнението на операцията „ANALYZE, която събира статистика за работата на БД.
- Добавена е възможността за настройка на метода на компресия, прилаган в системата TOAST, отговорна за съхранение на големи данни, като текстови блокове или геометрична информация. Освен метода на компресия pglz в TOAST вече може да се използва алгоритъм LZ4.
- Разширени са средствата за наблюдение на работата на СУБД. Добавени са представления за проследяване на прогреса на изпълнението на команди „COPY“ (pg_stat_progress_copy), статистика за репликационни слотове (pg_stat_replication_slots) и активност, свързана с WAL-журнала на транзакции (pg_stat_wal). Добавена е функция compute_query_id, която включва в различни подсистеми, като pg_stat_activity и EXPLAIN VERBOSE, проследяване на заявки с присвояване на уникален идентификатор за всяка заявка.
- Добавени са оптимизации в планирания на запитвания, които подобряват паралелната обработка на запитвания и позволяват увеличаване на производителността на едновременното изпълнение на операции за последователно сканиране на записи, паралелно стартиране на запитвания в PL/pgSQL чрез командата «RETURN QUERY» и паралелно изпълнение на запитвания в «REFRESH MATERIALIZED VIEW». За увеличаване на производителността на циклични вложени сливане (join) е реализирана поддръжка на допълнително кеширане.
- За оптимизация на изразите сега може да се използва разширена статистика, а за оптимизация на прозоречните функции — инкрементално сортиране.
- В хранимите процедури, които позволяват управление на транзакциите в блокове код, е реализирана поддръжка на определяне на върнати данни чрез параметри «OUT».
- Добавена е функция date_bin за закръгляне на стойности с тип timestamp в съответствие с зададен интервал. SELECT date_bin(’15 minutes’, TIMESTAMP ‘2020-02-11 15:44:17’, TIMESTAMP ‘2001-01-01’); 2020-02-11 15:30:00
- Добавени са изрази, определени в стандарта SQL, SEARCH и CYCLE, които опростяват подредбата и откритията на цикли в рекурсивни обобщени таблични изрази (Common Table Expression, CTE). WITH RECURSIVE search_tree(id, link, data) AS ( SELECT t.id, t.link, t.data FROM tree t UNION ALL SELECT t.id, t.link, t.data FROM tree t, search_tree st WHERE t.id = st.link ) SEARCH DEPTH FIRST BY id SET ordercol SELECT * FROM search_tree ORDER BY ordercol;
- В утилитата psql е подобрено автоматичното завършване на команди с табулация, в командата «\df» е добавена възможност за показване на аргументите на функциите, а в командата «\dX» е разширена показваната статистика.
- Предоставена е възможност за назначаване на привилегии на потребителите, които допускат само четене или само запис. Привилегиите могат да бъдат зададени в привязка към отделни таблици, представления и схеми чрез предварително определени роли pg_read_all_data и pg_write_all_data. GRANT pg_read_all_data TO user1;
- В новите инсталации по подразбиране е гарантирано прилагането на паролна автентикация с използването на метода SCRAM-SHA-256 вместо md5 (параметърът «password_encryption» при генерирането на postgresql.conf сега е зададен на стойност ‘scram-sha-256’).
Източник: opennet.ru
