F.38. pg_stat_advisor — советник Tantor BE для создания расширенной статистики#

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. Ограничения #

Для создания расширенной статистики должны быть выполнены следующие условия:

  1. max_parallel_workers_per_gather должен быть установлен в 0 (параллельные рабочие процессы отключены).

  2. SQL-выражение не должно быть UPDATE или DELETE.

  3. План выполнения не может включать узлы NestedLoop, MergeJoin или HashJoin.

  4. Запрос должен выполняться по нетемпоральной таблице.

  5. Выражение WHERE должно фильтровать от 2 до 8 столбцов (включительно) из одной таблицы.

  6. Таблица была проанализирована, и по крайней мере один столбец имеет ndistinct != 1.

  7. Расширенная статистика не будет создаваться, если эти столбцы уже образуют многоколонный индекс.

  8. Расширенная статистика не должна уже существовать для этих столбцов в таблице.

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)