ANALYZE#

ANALYZE

ANALYZE

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. Затем планировщик запросов использует эту статистику для определения наиболее эффективных планов выполнения запросов.

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

Когда список опций заключен в скобки, опции могут быть записаны в любом порядке. Синтаксис со скобками был добавлен в Tantor SE-1C11; нескобочный синтаксис устарел.

Параметры

VERBOSE

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

SKIP_LOCKED

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

boolean

Определяет, должна ли быть включена или выключена выбранная опция. Вы можете написать TRUE, ON или 1, чтобы включить опцию, и FALSE, OFF или 0, чтобы отключить ее. Значение boolean также может быть опущено, в этом случае предполагается TRUE.

table_name

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

column_name

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

Выводы

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

Примечания

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

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

В конфигурации по умолчанию Tantor SE-1C демон автоочистки (см. Раздел 23.1.6) автоматически выполняет анализ таблиц при их первой загрузке данными и при изменениях во время обычной работы. Когда автоочистка отключена, рекомендуется периодически выполнять команду ANALYZE или запускать ее сразу после внесения крупных изменений в содержимое таблицы. Точные статистические данные помогут планировщику выбрать наиболее подходящий план запроса и тем самым улучшить скорость обработки запросов. Обычная стратегия для баз данных с преимущественно чтением состоит в выполнении команды VACUUM и ANALYZE один раз в день во время низкой активности. (Этого может быть недостаточно при интенсивной активности обновления).

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

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

Для больших таблиц команда 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. Подробности см. в разделе Раздел 26.4.1.

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

В стандарте SQL нет оператора ANALYZE.