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

ANALYZE

примечание

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

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

Синтаксис

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

where option can be one of:

VERBOSE [ boolean ]
SKIP_LOCKED [ boolean ]
BUFFER_USAGE_LIMIT размер

and table_and_columns is:

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

Описание

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

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

Параметры

VERBOSE
Включает отображение сообщений о ходе выполнения.
SKIP_LOCKED
Указывает, что ANALYZE не должен ждать освобождения конфликтующих блокировок при попытке начать работу с отношением: если таблицу нельзя заблокировать немедленно без ожидания, она пропускается. Однако даже с этим параметром ANALYZE все еще может блокироваться при открытии индексов таблицы или при выборке строк из партиций, дочерних таблиц (по наследованию) и некоторых типов внешних таблиц. Также, хотя ANALYZE обычно обрабатывает все партиции указанной партиционированной таблицы, этот параметр приводит к пропуску всех партиций при наличии блокировки на самой партиционированной таблице.
BUFFER_USAGE_LIMIT
Задает размер кольцевого буфера стратегии доступа к буферу Buffer Access Strategy для команды ANALYZE. Этот размер используется для вычисления количества общих буферов, которые будут повторно использоваться в рамках данной стратегии. Команда 0 отключает использование Buffer Access Strategy. Когда этот параметр не указан, ANALYZE использует значение из vacuum_buffer_usage_limit. Большие значения могут позволить команде ANALYZE выполняться быстрее, но слишком большое значение может привести к вытеснению из общих буферов слишком большого числа других полезных страниц. Минимальное значение составляет 128 кБ, а максимальное — 16 Гб.
boolean
Указывает, следует ли включить или отключить выбранный параметр. Для включения можно использовать TRUE, ON или 1, для отключения — FALSE, OFF или 0. Значение boolean можно опустить — по умолчанию предполагается TRUE.
size
Задает объем памяти в килобайтах. Размер также может быть задан строкой, содержащей числовой размер, за которым следует одна из следующих единиц измерения объема памяти: B (байты), kB (килобайты), MB (мегабайты), GB (гигабайты) или TB (терабайты).
table_name
Задает имя конкретной таблицы для анализа, при необходимости дополненное схемой. Если не указано, анализируются все обычные таблицы, партиционированные таблицы и материализованные представления в текущей базе данных (но не внешние таблицы). Если указана партиционированная таблица, обновляется как статистика по ней в целом, так и по ее партициям.
column_name
Задает имя конкретного столбца для анализа. По умолчанию используется для всех столбцов.

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

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

Примечания

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

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

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

Во время выполнения команды ANALYZE временно изменяется путь поиска search_path на pg_catalog, pg_temp.

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

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

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

Эти элементы могут быть опущены, если 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.

Следующий синтаксис использовался до версии PostgreSQL 11 и продолжает поддерживаться:

ANALYZE [ VERBOSE ] [ table_and_columns [, ...] ]

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

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