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

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

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

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

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

Параметры

{ 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 собирает статистику путём выборки данных из листовых партиций. При этом статистика не собирается на листовых партициях — производится лишь выборка данных. Статистика HLL не собирается.
    При использовании ROOTPARTITION необходимо указать имя ALL или имя секционированной таблицы.
    Если указано ROOTPARTITION ALL, YMatrix собирает статистику по корневым партициям всех секционированных таблиц в базе данных. Если таких таблиц нет, выводится сообщение об отсутствии секционированных таблиц. Для несекционированных таблиц статистика не собирается.
    Если вы указываете имя таблицы с ROOTPARTITION, но таблица не является секционированной, статистика не собирается, и выводится предупреждение.
    Клаузу ROOTPARTITION нельзя использовать с VACUUM ANALYZE. Команда VACUUM ANALYZE ROOTPARTITION вызовет ошибку.
    Время выполнения ANALYZE ROOTPARTITION примерно такое же, как и анализ несекционированной таблицы с теми же данными, поскольку ANALYZE ROOTPARTITION выполняет выборку только из данных листовых партиций.
    Для секционированной таблицы sales_curr_yr следующая команда собирает статистику только по корневой партиции: ANALYZE ROOTPARTITION sales_curr_yr;

VERBOSE

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

table

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

column

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

Примечания

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

Рекомендуется регулярно запускать ANALYZE, особенно сразу после значительных изменений в содержимом таблицы. Точная статистика помогает базе данных YMatrix выбирать наиболее подходящий план запроса, что повышает скорость обработки запросов. Распространённой стратегией для баз данных «только для чтения» является ежедневный запуск 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, статистика не изменится.

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

  • При запуске ANALYZE на корневой таблице секционированной таблицы собирается статистика по всем листовым партициям. Листовые подпартиции — это таблицы самого нижнего уровня в иерархии подтаблиц, создаваемые YMatrix для использования в секционировании.
  • При запуске ANALYZE на листовой партиции собирается статистика только для этой листовой партиции и корневой партиции. Если данные в листовой партиции изменились (например, вы значительно обновили данные листовой подпартиции или произвели её замену), вы можете запустить ANALYZE на этой подпартиции для обновления статистики. По умолчанию, если у всех остальных листовых партиций уже есть статистика, команда обновляет статистику корневой партиции.
    Например, если вы собрали статистику по секционированной таблице с большим числом партиций, а затем обновили данные только в нескольких листовых партициях, вы можете запустить ANALYZE только на этих партициях, чтобы обновить статистику по ним и по корневой партиции.
  • При запуске ANALYZE на подтаблице, которая не является листовой партицией, статистика не собирается.
    Например, вы можете создать секционированную таблицу с партициями за 2006–2016 годы и подпартициями по месяцам каждого года. Если вы запустите ANALYZE на подтаблице за 2013 год, статистика собрана не будет. Если вы запустите ANALYZE на листовой партиции за март 2013 года, будет собрана статистика только по этой партиции.

ANALYZE не собирает статистику по внешним таблицам, которые были подключены через операцию замены секций:

  • Если ANALYZE запускается на внешней таблице-партиции, анализ этой партиции не выполняется.
  • Если ANALYZE или ANALYZE ROOTPARTITION запускается на корневой партиции, внешняя таблица-партиция не участвует в выборке, и статистика корневой таблицы не включает данные из внешней таблицы.
  • Если указан параметр VERBOSE, выводится сообщение: skipping external table.

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

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

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

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

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

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

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

Пример

Сбор статистики по таблице mytable:

ANALYZE mytable;

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

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

Смотрите также

VACUUM