Вместе с началом зимы цикл выпуска 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, на современный.
Новый алгоритм имеет лучшие статистические свойства, а его реализация менее зависит от платформы.
btree_gist: поддержка типа bool совершить: 57e3c516 , e2fbb883 К длинному списку поддерживаемых модулей btree_gist Добавлены логические типы данных.
Это все на данный момент. Продолжение следует после январского коммитфеста.
Теги: #postgresql #postgres #sql
-
Блог Для Покупателей - Хочу Купить!
19 Oct, 24 -
Самые Странные Звонки В Техподдержку
19 Oct, 24 -
Рекомендации Профиля – Какие Они?
19 Oct, 24 -
Почему Я Люблю Программирование
19 Oct, 24 -
Как Фрилансеру Честно Работать В Беларуси?
19 Oct, 24 -
Синкмл
19 Oct, 24