Перейти к основному содержимому

ANALYZE

примечание

Эта страница переведена при помощи нейросети GigaChat.

ANALYZE – сбор статистики по базе данных.

Синтаксис

ANALYZE [ ( option [, ...] ) ] [ table_and_columns [, ...] ]
ANALYZE [ VERBOSE ] [ table_and_columns [, ...] ]

where option can be one of:

VERBOSE [ boolean ]
SKIP_LOCKED [ boolean ]

and table_and_columns is:

table_name [ ( column_name [, ...] ) ]

Описание

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

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

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

Параметры

VERBOSE

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

SKIP_LOCKED

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

boolean

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

table_name

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

column_name

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

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

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

Примечания

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

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

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

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

Собранная статистика обычно включает:

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

Эти элементы могут быть опущены, если ANALYZE сочтет их несущественными (например, для столбца с уникальными значениями) или если тип данных не поддерживает нужные операторы. Подробности о статистике приведены в главе «Регулярные задачи обслуживания баз данных».

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

Степень анализа можно контролировать с помощью конфигурационной переменной default_statistics_target, либо задать индивидуальное значение для конкретного столбца через команду ALTER TABLE ... ALTER COLUMN ... SET STATISTICS. Это значение определяет:

  • максимально допустимое количество часто встречающихся значений;
  • количество интервалов в гистограмме.

По умолчанию используется значение 100, но его можно изменить для балансировки между точностью оценки и затратами времени/пространства. Установка значения 0 отключает сбор статистики по столбцу — это может быть полезно для столбцов, которые не участвуют в WHERE, GROUP BY или ORDER BY.

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

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

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

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

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

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

Каждый процесс, выполняющий ANALYZE, отображает информацию о своем прогрессе в представлении pg_stat_progress_analyze. Подробнее смотрите в разделе «Отчет о ходе выполнения ANALYZE».

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

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

Смотрите также

VACUUM, vacuumdb, «Отложенная очистка на основе затрат», «Служба Autovacuum», «Отчет о ходе выполнения ANALYZE»