Привет, Я DocuDroid!
Оценка ИИ поиска
Спасибо за оценку нашего ИИ поиска!
Мы будем признательны, если вы поделитесь своими впечатлениями, чтобы мы могли улучшить наш ИИ поиск для вас и других читателей.
GitHub

ANALYZE

Собирает статистику о базе данных.

Синтаксис

ANALYZE [VERBOSE] [<table> [ (<column> [, ...] ) ]]

ANALYZE [VERBOSE] {<root_partition_table_name>|<leaf_partition_table_name>} [ (<column> [, ...] )]

ANALYZE [VERBOSE] ROOTPARTITION {ALL | <root_partition_table_name> [ (<column> [, ...] )]}

Описание

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

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

ANALYZE не собирает статистику по внешним таблицам (external table).

Для партиционированных таблиц ANALYZE собирает HyperLogLog (HLL) — дополнительную статистику по листовым дочерним партициям. Статистика HLL используется для вычисления количества уникальных значений (Number of Distinct Values, NDV) для запросов к партиционированным таблицам.

  • При агрегировании оценок NDV по нескольким листовым дочерним партициям статистика HLL генерирует более точные оценки NDV, чем стандартная статистика таблицы.

  • При обновлении статистики HLL операции ANALYZE требуются только для тех листовых дочерних партиций, которые изменились. Например, ANALYZE требуется, если данные листовой дочерней партиции изменились или если листовая дочерняя партиция была обменена с другой таблицей. Дополнительную информацию об обновлении статистики партиционированных таблиц см. в разделе Примечания.

ВАЖНО

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

ПРИМЕЧАНИЕ

Вы также можете использовать утилиту Greengage DB analyzedb для обновления статистики таблиц. Утилита analyzedb может обновлять статистику для нескольких таблиц одновременно. Утилита также может проверять статистику таблиц и обновлять статистику только в том случае, если статистика устарела или не существует.

Параметры

Параметр Описание

{ <root_partition_table_name> | <leaf_partition_table_name> } [ (<column> [, …​] ) ]

Сбор статистики для партиционированных таблиц, включая статистику HLL. Статистика HLL собирается только для листовых дочерних партиций.

ANALYZE <root_partition_table_name> собирает статистику по всем листовым дочерним партициям и корневой партиции.

ANALYZE <leaf_partition_table_name> собирает статистику по листовой дочерней партиции.

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

ROOTPARTITION [ALL]

Сбор статистики только по корневой партиции партиционированных таблиц на основе данных в партиционированной таблице. Если возможно, ANALYZE использует статистику листовых дочерних партиций для генерации статистики корневой партиции. В противном случае ANALYZE собирает статистику путем выборки данных листовых дочерних партиций. Статистика по листовым дочерним партициям не собирается, вместо этого используется выборка (sampling). Статистика HLL не собирается.

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

При указании ROOTPARTITION необходимо указать либо ALL, либо имя партиционированной таблицы.

Если вы указываете ALL с ROOTPARTITION, Greengage DB собирает статистику для корневой партиции всех партиционированных таблиц в базе данных. Если в базе данных нет партиционированных таблиц, будет показано сообщение об отсутствии партиционированных таблиц. Для таблиц, не являющихся партиционированными, статистика не собирается.

Если вы указываете имя таблицы с ROOTPARTITION и таблица не является партиционированной, статистика для таблицы не собирается и будет показано предупреждающее сообщение.

Условие ROOTPARTITION недопустимо с VACUUM ANALYZE. Команда VACUUM ANALYZE ROOTPARTITION возвращает ошибку.

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

Для партиционированной таблицы sales_curr_yr следующий пример команды собирает статистику только по корневой партиции партиционированной таблицы:

ANALYZE ROOTPARTITION sales_curr_yr;

Следующий пример команды ANALYZE собирает статистику по корневой партиции всех партиционированных таблиц в базе данных:

ANALYZE ROOTPARTITION ALL;

VERBOSE

Включает отображение сообщений о ходе выполнения. Если указано, ANALYZE выдает следующую информацию:

  • Таблица, которая обрабатывается.

  • Запрос, который выполняется для генерации таблицы выборки.

  • Столбец, для которого вычисляется статистика.

  • Запросы, которые выдаются для сбора различной статистики для одного столбца.

  • Статистика, которая собирается.

table

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

column

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

Примечания

Сторонние таблицы (foreign table) анализируются только при явном выборе. Не все обертки сторонних данных (foreign data wrapper) поддерживают ANALYZE. Если обертка таблицы не поддерживает ANALYZE, команда выводит предупреждение и не выполняет никаких действий.

Рекомендуется запускать ANALYZE периодически или сразу после внесения заметных изменений в содержимое таблицы. Точная статистика помогает Greengage DB выбирать наиболее подходящий план запроса и тем самым повышать скорость обработки запросов. Распространенной стратегией для баз данных с преимущественно операциями чтения является запуск VACUUM и ANALYZE один раз в день в период низкой нагрузки (этого будет недостаточно, если происходит активное обновление данных). Вы можете проверить таблицы с отсутствующей статистикой, используя представление gp_stats_missing, которое находится в схеме gp_toolkit:

SELECT * from gp_toolkit.gp_stats_missing;

ANALYZE требует блокировки SHARE UPDATE EXCLUSIVE для целевой таблицы. Эта блокировка конфликтует со следующими блокировками: SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVE.

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

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

ПРИМЕЧАНИЕ

Когда вы создаете партиционированную таблицу с помощью команды CREATE TABLE, Greengage DB создает таблицу, которую вы указываете (корневая партиция или родительская таблица), а также создает иерархию таблиц на основе указанной вами иерархии партиций (дочерние таблицы).

  • Когда вы запускаете ANALYZE для корневой партиционированной таблицы, статистика собирается для всех листовых дочерних партиций. Листовые дочерние партиции — это таблицы самого низкого уровня в иерархии дочерних таблиц, созданных Greengage DB для использования партиционированной таблицей.

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

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

  • Когда вы запускаете ANALYZE для дочерней таблицы, которая не является листовой дочерней партицией, статистика не собирается.

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

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

  • Если ANALYZE запускается для партиции внешней таблицы, партиция не анализируется.

  • Если ANALYZE или ANALYZE ROOTPARTITION запускается для корневой партиции, партиции внешних таблиц не попадают в выборку и статистика корневой таблицы не включает партицию внешней таблицы.

  • Если указано условие VERBOSE, отображается информационное сообщение: skipping external table.

Серверный конфигурационный параметр Greengage DB optimizer_analyze_root_partition влияет на то, когда собирается статистика по корневой партиции партиционированной таблицы. Если параметр установлен в on (по умолчанию), ключевое слово ROOTPARTITION не требуется для сбора статистики по корневой партиции при запуске ANALYZE. Статистика корневой партиции собирается, когда вы запускаете ANALYZE для корневой партиции или когда вы запускаете ANALYZE для дочерней листовой партиции партиционированной таблицы, а другие дочерние листовые партиции имеют статистику. Если параметр установлен в off, требуется запустить ANALYZE ROOTPARTITION для сбора статистики корневой партиции.

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

Для больших таблиц ANALYZE берет случайную выборку содержимого таблицы, а не проверяет каждую строку. Это позволяет анализировать даже очень большие таблицы за небольшое время. Обратите внимание, однако, что статистика является лишь приблизительной и будет немного меняться при каждом запуске ANALYZE, даже если фактическое содержимое таблицы не изменилось. Это может привести к небольшим изменениям в оценке стоимости планировщиком, отображаемой командой EXPLAIN. В редких ситуациях эта неопределенность может привести к тому, что оптимизатор запросов выберет другой план запроса между запусками ANALYZE. Чтобы избежать этого, увеличьте объем статистики, собираемой командой ANALYZE, настроив параметр конфигурации default_statistics_target или для каждого столбца отдельно, установив целевую статистику для каждого столбца с помощью ALTER TABLE …​ ALTER COLUMN …​ SET (n_distinct …​) (см. ALTER TABLE). Целевое значение задает максимальное количество записей в списке наиболее частых значений и максимальное количество интервалов в гистограмме. Целевое значение по умолчанию равно 100, но его можно увеличить или уменьшить, чтобы найти баланс между точностью оценок планировщика и временем, затрачиваемым на ANALYZE, а также объемом места, занимаемого в pg_statistic. В частности, установка значения 0 деактивирует сбор статистики для этого столбца. Это может быть полезно для столбцов, которые никогда не используются в выражениях WHERE, GROUP BY или ORDER BY запросов, поскольку планировщику не понадобится статистика по таким столбцам.

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

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

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

Если статистика для таблицы отсутствует, серверный конфигурационный параметр gp_enable_relsize_collection контролирует, использует ли планировщик Postgres значение статистики по умолчанию или оценивает размер таблицы с помощью функции pg_relation_size(). По умолчанию планировщик Postgres использует значение статистики по умолчанию для оценки количества строк, если статистика недоступна.

Примеры

Собрать статистику для таблицы mytable:

ANALYZE mytable;

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

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

См. также