ANALYZE

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

Синтаксис

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

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

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

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

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

Описание

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

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

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

Параметры

VERBOSE

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

SKIP_LOCKED

Указывает, что команда 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 (см. ALTER TABLE). Целевое значение задает максимальное количество записей в списке наиболее распространенных значений и максимальное количество интервалов в гистограмме. Целевое значение по умолчанию равно 100, но оно может быть скорректировано вверх или вниз, чтобы компенсировать точность оценок планировщика относительно времени, затраченного на выполнение ANALYZE, и объема занимаемого пространства в pg_statistic. В частности, установка значения целевого показателя статистики равным нулю выключает сбор статистических данных для этого столбца. Скорее всего, будет полезно сделать это для столбцов, которые никогда не используются в предложениях WHERE, GROUP BY или ORDER BY, так как планировщик не будет использовать статистику по таким столбцам.

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

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

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

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

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

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

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

См. также

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