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»