Postgresql 15: Часть 3 Или Commitfest 2021-11

Вместе с началом зимы цикл выпуска 15-й версии продвинулся до еще одного, теперь уже третьего, коммитфеста.

Напомню, что подробнее о двух предыдущих можно прочитать здесь: 2021-07 , 2021-09 .

Теперь давайте посмотрим, что произошло на последнем ноябрьском коммите.



Мониторинг

Логирование процесса запуска совершить: 9ce346ea При запуске сервера большая часть времени обычно уходит на синхронизацию каталога данных с диском (fsync), удаление нерегистрируемых таблиц и применение файлов WAL. Если сервер долго не запускается, вы хотите знать, что именно делает процесс запуска и не завис ли он.

Ответ на этот вопрос теперь можно увидеть в журнале сервера, где будет фиксироваться текущий статус процесса запуска.

Частоту записи сообщений можно настроить с помощью нового параметра.

log_startup_progress_interval , по умолчанию раз в 10 секунд. На репликах, где процесс запуска выполняется постоянно и выкатывает изменения, информация об использовании WAL-файлов не будет записываться, чтобы не засорять журнал.

Новые события ожидания для команд управления файловым архивом WAL. совершить: 1b06d7ba Новые дополнения в списке ждать событий, принадлежащих типу IPC : ArchiveCommand, ArchiveCleanupCommand, RestoreCommand, RecoveryEndCommand. Каждое ожидание устанавливается на время выполнения команды оболочки соответствующего параметра конфигурации.

Функции просмотра содержимого каталогов логической репликации совершить: 1922d7c6 Для мониторинга работы логической репликации предусмотрен новый функции для просмотра соответствующих каталогов файловой системы:

Функция Каталог
pg_ls_ologicalsnapdir pg_ologic/снапшоты/
pg_ls_ologicalmapdir pg_ologic/отображения/
pg_ls_replslotdir pg_replslot/ /


Производительность

Сортировка данных: замена многофазного слияния на многопутевое сбалансированное слияние совершить: 65014000 Очередная оптимизация алгоритмов сортировки.

В частности, речь идет о внешней сортировке, представленной в планах запросов как «Метод сортировки: внешнее слияние».

Улучшения не очень значительны, но поклонники Кнута могут включить трассировку трассировки и изучить изменения, особенно при небольших значениях work_mem. Индексы BRIN не блокируют ГОРЯЧИЕ обновления совершить: 5753d4ee HOT-обновление не применяется, если хотя бы один столбец изменяемой команды UPDATE индексируется любым типом индекса.

Однако индексы BRIN не содержат ссылок на строки таблицы.

И вполне безопасно использовать HOT для обновления столбцов с такими индексами.

Таким образом, в версии 15 индексы BRIN больше не будут мешать оптимизации HOT-обновлений:

  
  
  
  
  
  
  
  
  
  
  
  
   

15=# CREATE INDEX flights_bi ON flights USING brin(actual_departure); 15=# SELECT pg_stat_reset_single_table_counters('flights'::regclass); 15=# UPDATE flights SET actual_departure = actual_departure + '5 min'::interval WHERE flight_id = 1; 15=# SELECT n_tup_hot_upd FROM pg_stat_all_tables WHERE relname = 'flights';



n_tup_hot_upd --------------- 1

Процесс архиватора и файлы в pg_wal/archive_status совершить: beb4e9ba Лучше не доводить дело до определенных ситуаций.

Например, если команда из archive_command Я почему-то давно перестал копировать файлы в архив, а места в pg_wal более чем достаточно.

Последствия будут следующими: в каталоге pg_wal и, в частности, в pg_wal/archive_status скопится огромное количество файлов.

При каждом запуске процесс архиватора должен сканировать archive_status в поисках файла для архивации, что может занять очень и очень много времени, хотя сама команда archive_command выполнил быстро.

Фактически в такой ситуации процесс архивирования практически парализован.

Чтобы немного упростить задачу, процесс архиватора будет запоминать несколько файлов для архивирования одновременно, чтобы не сканировать каталог archive_status при каждом запуске.

Но все же до такой ситуации лучше не доводить.

Узел сбора: оптимизация пересылки строк из рабочих процессов совершить: 46846433 В параллельных запросах узел Gather теперь более эффективно получает строки от рабочих процессов.

Разработчики настроены серьёзно думают чрезмерное снижение параллельная_tuple_cost , так что в новых реалиях чаще выбираются планы с параллельным исполнением.

start_with и ^@: добавлена вспомогательная функция для планировщика.

совершить: а148f8bc Способ выполнения функций часто является «черным ящиком» для СУБД.

Но у разработчиков есть возможность сообщить о них планировщику с помощью вспомогательные функции .

Эта вспомогательная функция была добавлена для функции start_with и связанного с ней оператора ^@.

Вы можете увидеть изменения, оценив мощность простого запроса.

Посмотрим, как часто имя Павел появляется на билетах.



14=# SELECT count(*) FROM tickets WHERE starts_with(passenger_name,'PAVEL');



count ------- 24090

А теперь что по этому поводу думает планировщик в 14 версии:

14=# EXPLAIN SELECT * FROM tickets WHERE starts_with(passenger_name,'PAVEL');



QUERY PLAN ------------------------------------------------------------------ Seq Scan on tickets (cost=0.00.86286.54 rows=983241 width=104) .



Как видите, оценка весьма неточная.

И теперь в версии 15:

15=# EXPLAIN SELECT * FROM tickets WHERE starts_with(passenger_name,'PAVEL');



QUERY PLAN -------------------------------------------------------------------------------- Gather (cost=1000.00.68502.23 rows=27236 width=104) .



Практически идеально.

Дополнительный бонус для тех, кто использует правило сортировки C. Функция opens_with, как и оператор ^@, сможет использовать не только индексы SP-GiST, но и Btree.

Процедурные языки

PL/pgSQL: локализация ошибок в разделе инициализации совершить: acb2d7d5 Выполните анонимный блок PL/pgSQL:

14=# DO $$DECLARE x int := 42; y int := 1/0; z text := 'Hello'; BEGIN END; $$;



ERROR: division by zero CONTEXT: SQL expression "1/0" PL/pgSQL function inline_code_block line 5 during statement block local variable initialization

Понятно, что на 0 делить нельзя, но почему в 5-й строке ошибка? А все потому, что любая ошибка в разделе DECLARE отмечается строкой, где находится слово BEGIN. И неважно, при инициализации какой переменной произойдет ошибка, строка все равно останется пятой строкой в сообщении.

Честно говоря, это неудобно.

Был.

И сейчас:

15=# DO $$DECLARE x int := 42; y int := 1/0; z text := 'Hello'; BEGIN END; $$;



ERROR: division by zero CONTEXT: SQL expression "1/0" PL/pgSQL function inline_code_block line 3 during statement block local variable initialization



Репликация

Логическая репликация всех таблиц схемы совершить: 5а283246 Есть два способа указать список таблиц при создании публикации.

Либо укажите это явно, либо укажите FOR ALL TABLES. Во втором случае в публикацию включаются все таблицы базы данных.

Но что, если вы хотите реплицировать все таблицы в определенных схемах, а не всю базу данных? В 15 версии все просто:

CREATE PUBLICATION bookings_pub FOR ALL TABLES IN SCHEMA bookings;

Теперь в другой базе данных, если у вас есть схема бронирования и все ее таблицы, вы можете подписаться на публикацию.

Новая таблица в схеме резервирования будет автоматически добавлена в публикацию.

Правда в том, что никакого чуда с подпиской не произойдет. Логическая репликация пока не способна передавать команды DDL. Поэтому вам придется создать таблицу в базе данных подписчиков и обновить подписку (ALTER SUBSCRIPTION… REFRESH PUBLICATION).

Описание от депеш.

pg_receivewal: поддержка lz4 совершить: баббббб59 , d62bcc8b Полезность pg_receivewal , помимо gzip, теперь поддерживает метод сжатия lz4 (если PostgreSQL был скомпилирован с опцией --with-lz4).

Для выбора метода сжатия в утилите pg_receivewal --compression-method появился новый параметр.



Безопасность

Все три нововведения этой группы относятся к теме администрирования серверов без использования прав суперпользователя.

Разрешения для pg_backend_memory_contexts и pg_shmem_allocations совершить: 77ea4f94 Предопределенная роль pg_read_all_stats получил доступ к просмотрам pg_backend_memory_contexts И pg_shmem_allocations , а также функции, на которых создаются эти представления.

Разрешения для pg_log_backend_memory_contexts совершить: f0b051e3 С функциями pg_log_backend_memory_contexts Убрана проверка работать только под суперпользователем.

Теперь суперпользователь может предоставить права на выполнение этой функции любой роли.

Разрешения CHECKPOINT совершить: 4168a474 Новая фиксированная роль pg_checkpointer дает полномочия на выполнение команды CHECKPOINT.

Разнообразный

amcheck: проверяет наличие TOAST совершить: bd807be6 В модуле amcheck появились новые проверки.

Теперь значения, передаваемые в TOAST, проверяются на правильность размера и метода сжатия.

Новая реализация случайного совершить: 3804539е Заменен устаревший алгоритм генерации псевдослучайных чисел, используемый функцией Random, на современный.

Соросиро128+ .

Новый алгоритм имеет лучшие статистические свойства, а его реализация менее зависит от платформы.

btree_gist: поддержка типа bool совершить: 57e3c516 , e2fbb883 К длинному списку поддерживаемых модулей btree_gist Добавлены логические типы данных.




Это все на данный момент. Продолжение следует после январского коммитфеста.

Теги: #postgresql #postgres #sql

Вместе с данным постом часто просматривают: