ANALYZE — сбор статистики о базе данных
ANALYZE [ (option[, ...] ) ] [table_and_columns[, ...] ] гдеoptionможет быть одним из: VERBOSE [boolean] SKIP_LOCKED [boolean] BUFFER_USAGE_LIMITsizeиtable_and_columnsимеет вид:table_name[ (column_name[, ...] ) ]
ANALYZE собирает статистику о содержимом
таблиц в базе данных и сохраняет результаты в системном каталоге pg_statistic.
Впоследствии планировщик запросов использует эту
статистику, чтобы помочь определить наиболее эффективные планы выполнения
запросов.
Без списка table_and_columns
ANALYZE обрабатывает каждую таблицу и материализованное представление
в текущей базе данных, которые текущий пользователь имеет право анализировать.
При наличии списка ANALYZE обрабатывает только указанные таблицы.
Дополнительно можно указать список имен столбцов для таблицы,
и в этом случае будет собрана статистика только для этих столбцов.
VERBOSEВключает отображение сообщений о прогрессе.
SKIP_LOCKED
Указывает, что ANALYZE не должен ждать освобождения
конфликтующих блокировок при начале работы с отношением:
если отношение не может быть заблокировано немедленно без ожидания, оно
пропускается. Обратите внимание, что даже с этой опцией ANALYZE
все еще может блокироваться при открытии индексов отношения или при получении
строк-образцов из секций, дочерних таблиц наследования и некоторых
типов внешних таблиц. Также, хотя ANALYZE
обычно обрабатывает все секции указанных секционированных таблиц,
эта опция приведет к тому, что ANALYZE пропустит все
секции, если на секционированной таблице есть конфликтующая блокировка.
BUFFER_USAGE_LIMIT
Задает размер кольцевого буфера Buffer Access Strategy
(стратегии доступа к буферам) для ANALYZE. Этот размер используется для
вычисления количества разделяемых буферов, которые будут повторно использоваться в рамках
этой стратегии. 0 отключает использование
Buffer Access Strategy. Когда эта опция не указана,
ANALYZE использует значение из
vacuum_buffer_usage_limit. Более высокие настройки могут
позволить ANALYZE выполняться быстрее, но слишком
большое значение может привести к вытеснению слишком многих других полезных страниц из
разделяемых буферов. Минимальное значение — 128 kB, а
максимальное — 16 GB.
boolean
Указывает, следует ли включить или выключить выбранную опцию.
Вы можете написать TRUE, ON или
1, чтобы включить опцию, и FALSE,
OFF или 0, чтобы выключить ее.
Значение boolean также может быть
опущено, и в этом случае предполагается TRUE.
size
Указывает объем памяти в килобайтах. Размеры также могут быть указаны
строкой, содержащей числовое значение, за которым следует одна из
следующих единиц измерения памяти: B (байты),
kB (килобайты), MB (мегабайты),
GB (гигабайты) или TB (терабайты).
table_nameИмя (возможно, с указанием схемы) конкретной таблицы для анализа. Если опущено, анализируются все обычные таблицы, секционированные таблицы и материализованные представления в текущей базе данных (но не внешние таблицы). Если указанная таблица является секционированной, обновляется как статистика наследования секционированной таблицы в целом, так и статистика отдельных секций.
column_nameИмя конкретного столбца для анализа. По умолчанию — все столбцы.
При указании VERBOSE команда ANALYZE выводит
сообщения о прогрессе, указывая, какая таблица в данный момент обрабатывается.
Также выводятся различные статистические данные о таблицах.
Для анализа таблицы обычно необходимо иметь привилегию MAINTAIN
на таблицу. Однако владельцам базы данных разрешено
анализировать все таблицы в своих базах данных, кроме общих каталогов.
ANALYZE пропустит любые таблицы, на которые у вызывающего пользователя
нет права на анализ.
Внешние таблицы анализируются только при явном выборе. Не все
оболочки сторонних данных (foreign data wrappers) поддерживают ANALYZE.
Если оболочка таблицы не поддерживает ANALYZE, команда выводит
предупреждение и ничего не делает.
В конфигурации Digital Q.DataBase по умолчанию
демон автоочистки (см. Раздел 3.9.1.6)
заботится об автоматическом анализе таблиц, когда они впервые загружаются
данными, и по мере их изменения в ходе обычной работы.
Когда автоочистка отключена,
рекомендуется периодически запускать ANALYZE или
сразу после внесения основных изменений в содержимое таблицы. Точная
статистика поможет планировщику выбрать наиболее подходящий план
запроса и тем самым повысить скорость обработки запросов. Распространенная
стратегия для баз данных с преимущественно чтением — запускать VACUUM
и ANALYZE один раз в день в период низкой нагрузки.
(Этого будет недостаточно, если есть высокая активность обновлений.)
Пока выполняется ANALYZE, search_path временно изменяется на pg_catalog,
pg_temp.
ANALYZE
требует только блокировку на чтение целевой таблицы, поэтому может выполняться
параллельно с другой не-DDL активностью на таблице.
Статистика, собираемая командой ANALYZE, обычно
включает список некоторых наиболее частых значений в каждом столбце и
гистограмму, показывающую приблизительное распределение данных в каждом
столбце. Одно или оба из этих значений могут быть опущены, если
ANALYZE считает их неинтересными (например,
в столбце с уникальным ключом нет общих значений) или если
тип данных столбца не поддерживает соответствующие операторы. Подробнее
о статистике можно прочитать в Глава 3.9.
Для больших таблиц 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, чтобы поддерживать статистику иерархии таблиц
в актуальном состоянии.
Если какие-либо дочерние таблицы или секции являются внешними таблицами, чьи оболочки сторонних данных
(foreign data wrappers) не поддерживают ANALYZE, эти таблицы
игнорируются при сборе статистики наследования.
Если анализируемая таблица полностью пуста, ANALYZE
не запишет новую статистику для этой таблицы. Любая существующая статистика
будет сохранена.
Каждый серверный процесс (backend), выполняющий ANALYZE, будет сообщать о своем прогрессе
в представлении pg_stat_progress_analyze. См.
Раздел 3.12.4.1 для получения подробной информации.
В стандарте SQL нет оператора ANALYZE.
Следующий синтаксис использовался до версии Digital Q.DataBase 11 и до сих пор поддерживается:
ANALYZE [ VERBOSE ] [ table_and_columns [, ...] ]