Сбор статистики о базе данных.
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) при запросах к секционированным таблицам.
{ root_partition_table_name | leaf_partition_table_name } [ (column [, ...] ) ]
ROOTPARTITION [ALL]
ANALYZE ROOTPARTITION sales_curr_yr;VERBOSE
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 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.