F.38. pg_stat_advisor — советник Tantor BE для создания расширенной статистики#
F.38. pg_stat_advisor — советник Tantor BE для создания расширенной статистики #
Версия: 1.5
F.38.1. Обзор #
pg_stat_advisor — это расширение Tantor BE, предназначенное для анализа производительности запросов и создания дополнительных статистик для улучшения плана запроса.
F.38.2. Ограничения #
Для создания расширенной статистики должны быть выполнены следующие условия:
max_parallel_workers_per_gatherдолжен быть установлен в0(параллельные рабочие процессы отключены).SQL-выражение не должно быть
UPDATEилиDELETE.План выполнения не может включать узлы NestedLoop, MergeJoin или HashJoin.
Запрос должен выполняться по нетемпоральной таблице.
Выражение
WHEREдолжно фильтровать от 2 до 8 столбцов (включительно) из одной таблицы.Таблица была проанализирована, и по крайней мере один столбец имеет
ndistinct != 1.Расширенная статистика не будет создаваться, если эти столбцы уже образуют многоколонный индекс.
Расширенная статистика не должна уже существовать для этих столбцов в таблице.
F.38.3. Установка #
Добавьте pg_stat_advisor в параметр конфигурации shared_preload_libraries в вашем файле postgresql.conf, затем перезапустите базу данных Tantor BE, чтобы изменения вступили в силу.
Примечание
Вы не можете использовать LOAD ‘pg_stat_advisor’; потому что это расширение зависит от хуков, которые должны быть инициализированы при запуске сервера.
shared_preload_libraries = 'pg_stat_advisor';
F.38.4. Использование #
Параметр pg_stat_advisor.version отображает текущую версию расширения; он доступен только для чтения и предназначен для информационных целей.
SHOW pg_stat_advisor.version;
Существует параметр
pg_stat_advisor.suggest_statistics_threshold
GUC, который можно использовать для установки suggest_statistics_threshold. Это
отношение количества строк, запланированных планировщиком, к общему числу
возвращённых кортежей. Если параметр установлен в 0, вывод отключается.
SET pg_stat_advisor.suggest_statistics_threshold = 0.1;
pg_stat_advisor.min_duration GUC задаёт минимальную длительность запроса (в миллисекундах), необходимую для активации расширения; установка значения -1 полностью отключает расширение.
SET pg_stat_advisor.min_duration = 100;
Параметр pg_stat_advisor.ring_buffer_capacity задаёт размер (в байтах) кольцевого буфера, используемого для хранения данных о расширенной статистике, которая будет создана; этот буфер работает по кольцевому принципу, перезаписывая старые записи при заполнении. Его можно установить только в postgresql.conf.
pg_stat_advisor.ring_buffer_capacity = 1024
Чтобы установить максимальное количество рабочих процессов, которые будут генерировать и собирать расширенную статистику, настройте параметр pg_stat_advisor.deferred_jobs_max в файле postgresql.conf.
SET pg_stat_advisor.pg_stat_advisor.deferred_jobs_max = 1024;
Чтобы собрать статистику немедленно после создания расширенной
статистики, включите параметр
pg_stat_advisor.enable_analyze. Чтобы
отложить сбор и позволить autovacuum или ручной
команде ANALYZE выполнить её, отключите этот параметр.
SET pg_stat_advisor.enable_analyze = on;
Чтобы ограничить количество столбцов таблицы, используемых при создании расширенной статистики, настройте параметр pg_stat_advisor.ext_stats_max_columns.
SET pg_stat_advisor.ext_stats_max_columns = 8;
F.38.5. Примеры #
SET pg_stat_advisor.suggest_statistics_threshold = 0.1;
CREATE TABLE t (i INT, j INT);
INSERT INTO t SELECT i/10, i/100 FROM generate_series(1, 1000000) i;
ANALYZE t;
EXPLAIN ANALYZE SELECT * FROM t WHERE i = 100 AND j = 10;
QUERY PLAN
----------------------------------------------------------------------------------------------
------------------
Gather (cost=1000.00..11675.10 rows=1 width=8) (actual time=0.526..61.564 rows=10 loops=1)
Workers Planned: 2
Workers Launched: 2
-> Parallel Seq Scan on t (cost=0.00..10675.00 rows=1 width=8) (actual time=35.369..54.44
7 rows=3 loops=3)
Filter: ((i = 100) AND (j = 10))
Rows Removed by Filter: 333330
Planning Time: 0.148 ms
Execution Time: 61.589 ms
(8 rows)
EXPLAIN ANALYZE SELECT * FROM t WHERE i = 100 AND j = 10;
QUERY PLAN
----------------------------------------------------------------------------------------------
------------------
Gather (cost=1000.00..11675.10 rows=10 width=8) (actual time=0.400..59.292 rows=10 loops=1)
Workers Planned: 2
Workers Launched: 2
-> Parallel Seq Scan on t (cost=0.00..10675.00 rows=1 width=8) (actual time=35.614..54.29
1 rows=3 loops=3)
Filter: ((i = 100) AND (j = 10))
Rows Removed by Filter: 333330
Planning Time: 0.081 ms
Execution Time: 59.413 ms
(8 rows)