ANALYZE

ANALYZE — собрать статистику о базе данных


Синтаксис

ANALYZE [ ( параметр [, ...] ) ] [ таблица_и_столбцы [, ...] ]
ANALYZE [ VERBOSE ] [ таблица_и_столбцы [, ...] ]

где параметром может быть:

    VERBOSE [ логическое_значение ]
    SKIP_LOCKED [ логическое_значение ]

а таблица_и_столбцы это:

    имя_таблицы [ ( имя_столбца [, ...] ) ]

Описание

Команда ANALYZE собирает статистическую информацию о содержании таблиц в базе данных и сохраняет результаты в системном каталоге pg_statistic. Впоследствии планировщик запросов использует эти статистические данные для определения наиболее эффективных планов выполнения запросов.

Без списка таблица_и_столбцы команда ANALYZE обрабатывает все таблицы и материализованные представления в текущей базе данных, которые текущий пользователь имеет право анализировать. Со списком ANALYZE обрабатывает только те таблицы, которые в нем указаны. Кроме того, можно указать список имен столбцов таблицы; в этом случае собираются статистические данные только для этих столбцов.

Когда список заключается в скобки, параметры можно писать в любом порядке. Написание без скобок считается устаревшим.


Параметры

VERBOSE

Включает отображение сообщений о ходе выполнения.

SKIP_LOCKED

Указывает, что команда ANALYZE не должна ждать освобождения конфликтующих блокировок при начале работы над отношением: если отношение нельзя заблокировать сразу, без ожидания, оно пропускается. Обратите внимание, что даже при использовании этого параметра ANALYZE по-прежнему может блокироваться при открытии индексов отношения или при получении выборки строк из партиций, потомков таблиц и некоторых типов сторонних таблиц. Кроме того, хотя обычно ANALYZE обрабатывает все партиции указанных партиционированных таблиц, этот параметр заставит ANALYZE пропустить все партиции при наличии на партиционированной таблице конфликтующей блокировки.

логическое_значение

Указывает, должна ли выбранная функция быть включена или выключена. Для включения функции можно написать TRUE, ON или 1, а для выключения — FALSE, OFF или 0. Если этот параметр опущен, предполагается значение TRUE.

имя_таблицы

Имя конкретной таблицы для анализа (может быть дополнено схемой). Если этот параметр опущен, то анализируются все обычные таблицы, партиционированные таблицы и материализованные представления в текущей базе данных (но не сторонние таблицы). Если указанная таблица является партиционированной, то обновляется как статистика наследования партиционированной таблицы в целом, так и статистика отдельных партиций.

имя_столбца

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


Выводимая информация

При указании VERBOSE команда ANALYZE выдает сообщения о ходе выполнения, показывая, какая таблица обрабатывается в настоящее время. Также печатаются различные статистические данные о таблицах.


Примечания

Для анализа таблицы обычно необходимо быть владельцем таблицы или суперпользователем. Однако владельцам баз данных разрешается анализировать все таблицы в своих базах данных, за исключением разделяемых каталогов. (Ограничение для разделяемых каталогов означает, что по-настоящему глобальную команду ANALYZE может выполнить только суперпользователь.) ANALYZE пропустит все таблицы, для которых вызывающий пользователь не имеет разрешения на анализ.

Сторонние таблицы анализируются только при явном указании. Не все обертки сторонних данных поддерживают ANALYZE. Если обертка таблицы не поддерживает ANALYZE, команда выводит предупреждение и ничего не делает.

В конфигурации QHB по умолчанию процесс «Автовакуум» (см. подраздел Процесс «Автовакуум») запускает автоматический анализ таблиц, когда они впервые заполняются данными, а также по мере их изменения в ходе штатных операций. Если автоочистка выключена, рекомендуется запускать ANALYZE периодически или сразу после внесения существенных изменений в содержимое таблицы. Точная статистика поможет планировщику выбрать наиболее подходящий план запроса и тем самым повысить скорость обработки запроса. Общая стратегия для баз данных, где данные преимущественно читаются, заключается в запуске VACUUM и ANALYZE раз в день во время наименьшей активности. (Этого будет недостаточно, если данные обновляются активно.)

ANALYZE требуется только блокировка на чтение в целевой таблице, поэтому данная команда может выполняться параллельно с другими действиями в таблице.

Статистические данные, собранные ANALYZE, обычно включают список некоторых наиболее распространенных значений в каждом столбце и гистограмму, показывающую примерное распределение данных в каждом столбце. Один или оба этих элемента статистики могут быть опущены, если ANALYZE сочтет их неинтересными (например, в столбце уникального ключа нет общих значений) или если тип данных столбца не поддерживает соответствующие операторы. Более подробная информация о статистике приведена в главе Регулярные задачи обслуживания базы данных.

Для больших таблиц ANALYZE берет случайную выборку содержимого таблицы, а не изучает каждую строку. Это позволяет за короткое время проанализировать даже очень большие таблицы. Однако обратите внимание, что статистические данные окажутся всего лишь приблизительными и будут незначительно меняться при каждом запуске ANALYZE, даже если фактическое содержимое таблицы не изменилось. Это может привести к небольшим изменениям в расчетной стоимости запросов, показываемых командой EXPLAIN. В редких случаях этот недетерминизм приведет к смене выбора планов запросов у планировщика после выполнения ANALYZE. Чтобы избежать этого, нужно увеличить объем статистики, собранной методом ANALYZE, как описано ниже.

Количеством статистики можно управлять, настраивая конфигурационную переменную default_statistics_target или на уровне столбцов устанавливая целевой показатель статистики для каждого столбца командой ALTER TABLE ... ALTER COLUMN ... SET STATISTICS. Значение целевого показателя задает максимальное количество записей в списке наиболее распространенных значений и максимальное количество интервалов в гистограмме. Значение целевого показателя по умолчанию равно 100, но может быть увеличено или уменьшено, чтобы сбалансировать точность оценок планировщика относительно времени, затраченного на выполнение ANALYZE, и объема занимаемого пространства в pg_statistic. В частности, установка целевого показателя статистики в ноль выключает сбор статистических данных для этого столбца. Скорее всего, будет полезно сделать это для столбцов, которые никогда не используются в предложениях WHERE, GROUP BY или ORDER BY, так как планировщику не будет никакой пользы от статистики по таким столбцам.

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

Один из показателей, оцениваемых командой ANALYZE, — это число различных значений, встречающихся в каждом столбце. Поскольку рассматривается только подмножество строк, эта оценка иногда может быть довольно неточной, даже с максимально возможным целевым показателем статистики. Если эта неточность приводит к плохим планам запросов, можно вручную определить более точное значение, а затем задать его командой ALTER TABLE ... ALTER COLUMN ... SET (n_distinct = ...).

Если анализируемая таблица имеет потомков в иерархии наследования, ANALYZE будет собирать статистику дважды: один раз только по строкам родительской таблицы и второй раз по строкам родительской таблицы со всеми ее потомками. Этот второй набор статистических данных необходим при планировании запросов, проходящих через все дерево наследования. В этом случае сами дочерние таблицы по отдельности не анализируются Однако процесс «Автовакуум» при принятии решения о запуске автоматического анализа для этой таблицы будет рассматривать операции добавления или обновления данных только в самой родительской таблице. Если эта таблица изменяется редко, наследуемая статистика не будет обновляться до тех пор, пока команда ANALYZE не будет запущена вручную.

Для партиционированных таблиц ANALYZE собирает статистику путем выборки строк из всех партиций; кроме того, она будет выполнять рекурсивный обход всех партиций и обновлять их статистику. Каждая листовая партиция анализируется только один раз, даже при многоуровневом партиционировании. Статистика никогда не собирается только по родительской таблице (без данных из ее партиций), потому что партиционирование гарантирует, что эта таблица будет пустой.

Процесс «Автовакуум» не обрабатывает партиционированные таблицы и родительские таблицы в иерархии наследования, если изменяются только их потомки. Обычно для поддержания актуальности статистики в табличной иерархии необходимо периодически запускать ANALYZE вручную.

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

Если анализируемая таблица совершенно пуста, ANALYZE не будет записывать для этой таблицы новую статистику, но вся существующая статистика будет сохранена.

Каждый обслуживающий процесс, запускающий ANALYZE, будет записывать ход ее выполнения в представлении pg_stat_progress_analyze. Более подробную информацию см. в подразделе Отчет о ходе выполнения ANALYZE.


Совместимость

В стандарте SQL нет команды ANALYZE.


См. также

VACUUM, vacuumdb, Задержка очистки по стоимости, Процесс «Автовакуум», Отчет о ходе выполнения ANALYZE