Сбор статистики для CBO

В этом разделе описываются базовые принципы Cost‑Based Optimizer (CBO) StarRocks и способы сбора статистики, чтобы CBO мог выбирать оптимальный план запроса. В StarRocks 2.4 добавлены гистограммы для более точного учёта распределения данных.

Начиная с v3.2.0, StarRocks поддерживает сбор статистики для таблиц Hive, Iceberg и Hudi, снижая зависимость от внешних metastore. Синтаксис схож со сбором статистики для внутренних таблиц StarRocks.

Что такое CBO

CBO критически важен для оптимизации запросов. После того как SQL‑запрос поступает в StarRocks, он парсится в логический план выполнения. CBO переписывает и трансформирует логический план в несколько физических, оценивает стоимость выполнения каждого оператора (CPU, память, сеть, I/O) и выбирает путь с наименьшей стоимостью в качестве итогового физического плана.

CBO StarRocks впервые появился в 1.16.0 и включён по умолчанию с 1.19. Созданный на базе каскадного фреймворка, он опирается на разнообразную статистическую информацию и способен выбрать план с минимальной стоимостью из десятков тысяч вариантов, значительно повышая эффективность сложных запросов.

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

Типы статистики

StarRocks собирает различные статистики, используемые как входные данные для оценок CBO.

Базовые статистики

По умолчанию StarRocks периодически собирает следующие базовые показатели по таблицам и столбцам:

  • row_count — общее число строк в таблице

  • data_size — размер данных столбца

  • ndv — кардинальность столбца (число различных значений)

  • null_count — число значений NULL в столбце

  • min — минимальное значение в столбце

  • max — максимальное значение в столбце

Полные статистики хранятся в таблице column_statistics базы _statistics_. Пример запроса:

SELECT * FROM _statistics_.column_statistics\G

Гистограмма (Histogram)

В StarRocks 2.4 добавлены гистограммы как эффективный способ представления распределения данных. Для таблиц с перекосом гистограммы помогают точнее отражать распределение.

StarRocks использует равновысотные гистограммы (equi‑height) — каждый бакет содержит одинаковый объём данных. Часто встречающиеся значения, существенно влияющие на селективность, могут получать отдельные бакеты. Большее число бакетов повышает точность, но немного увеличивает потребление памяти. Можно настраивать число бакетов и MCV (most common values) при сборе.

Гистограммы применимы для столбцов с выраженным перекосом и частыми обращениями. Если данные распределены равномерно, гистограммы не требуются. Поддерживаются числовые типы, DATE, DATETIME и строковые типы.

Статистики гистограмм хранятся в histogram_statistics базы _statistics_.

Совместная статистика по нескольким столбцам

С v3.5.0 поддерживается сбор совместной статистики по нескольким столбцам (мульти‑колоночный NDV). В большинстве сценариев оптимизатор предполагает независимость столбцов, что при наличии корреляции даёт неточные оценки и может приводить к неудачным планам. Сейчас поддерживается именно NDV по нескольким столбцам, применимый, например, при:

  • Оценке нескольких эквивалентных предикатов, объединённых AND

  • Оценке узлов Agg

  • Применении стратегии aggregate push‑down

Сбор мульти‑колоночной статистики пока только ручной (по умолчанию — выборочный). Данные хранятся в _statistics_.multi_column_statistics.

Типы и методы сбора

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

Поддерживаются два типа: полный (Full) и выборочный (Sampled), каждый — в авто‑ и ручном режимах. По умолчанию выполняется автоматический полный сбор. Если вы не хотите использовать его, настройте собственную задачу.

Collection type

Collection method

Description

Advantage and disadvantage

Full collection

Automatic/manual

Сканирование всей таблицы; сбор по партициям. Партиции без изменений пропускаются. Полные статистики — в _statistics_.column_statistics.

+ Точно; − Ресурсоёмко и медленнее. С 2.5 можно ограничивать период авто‑сбора.

Sampled collection

Automatic/manual

Равномерная выборка N строк из каждой партиции; сбор по таблице. NDV оценивается по выборке. Данные — в _statistics_.table_statistic_v1.

+ Быстро и экономно; − Менее точно, может снижать точность CBO.

С v3.5.0 и выборочные, и полные статистики хранятся в _statistics_.column_statistics, чтобы оптимизатор использовал самые свежие данные вне зависимости от метода. Вернуть прежнее поведение можно, установив statistic_use_meta_statistics=false в FE.

Predicate Column

С v3.5.0 StarRocks записывает Predicate Columns — столбцы, часто используемые в WHERE/JOIN/GROUP BY/DISTINCT. Список хранится в _statistics_.predicate_columns и доступен также через information_schema.column_stats_usage. Это позволяет при авто‑сборе ограничивать сбор только нужных столбцов, экономя ресурсы.

Сбор статистики

StarRocks предлагает автоматический, ручной и настраиваемый сбор.

По умолчанию выполняется периодический автоматический полный сбор. Интервал — 10 минут. При существенных изменениях данных сбор триггерится автоматически. Полный сбор ресурсоёмок; отключите enable_collect_full_statistic, если хотите по умолчанию использовать выборочный сбор. С v3.5.0 поведение авто‑сбора адаптивно (переключение Full↔Sampled, сбор только Predicate Columns), управляется параметрами statistic_auto_*.

Автоматический сбор

Поддерживаются окна сбора, пороги «здоровья» статистики, отдельные политики для малых/больших таблиц и др. См. исходные параметры FE: statistic_collect_interval_sec, statistic_auto_analyze_start_time, statistic_auto_collect_ratio, statistic_auto_collect_sample_threshold, statistic_auto_collect_small_table_size/_interval, statistic_auto_collect_large_table_interval, statistic_max_full_collect_data_size, statistic_auto_collect_predicate_columns_threshold, др.

Ручной сбор

Используйте ANALYZE TABLE для ручных задач сбора (синхронный/асинхронный режим):

ANALYZE [FULL|SAMPLE] TABLE tbl_name 
    [( col_name [, col_name]... )
    | col_name [, col_name]...
    | ALL COLUMNS
    | PREDICATE COLUMNS
    | MULTIPLE COLUMNS ( col_name [, col_name]...)]
[PARTITION (partition_name [, partition_name]...)]
[WITH [SYNC | ASYNC] MODE]
[PROPERTIES (property [, property]...)]

Гистограммы собираются так:

ANALYZE TABLE tbl_name UPDATE HISTOGRAM ON col_name [, col_name]
[WITH SYNC | ASYNC MODE]
[WITH N BUCKETS]
[PROPERTIES (property [,property])]

Кастомные авто‑задачи

Создавайте через CREATE ANALYZE для БД/таблиц/столбцов, в том числе для гистограмм. Свойства настраиваются в PROPERTIES.

Сбор при загрузке данных

Для INSERT INTO/OVERWRITE StarRocks может запускать асинхронный сбор статистики по окончании DML (ожидание по умолчанию — 30 секунд). Управление — через свойства задачи.

Просмотр/удаление/отмена

  • Просмотр пользовательских задач: SHOW ANALYZE JOB

  • Статусы текущих задач: SHOW ANALYZE STATUS

  • Удаление статистики: DROP STATS tbl_name, DROP MULTIPLE COLUMNS STATS tbl_name, удаление гистограмм ANALYZE TABLE ... DROP HISTOGRAM

  • Отмена выполнения: KILL ANALYZE <ID>

Статистика для внешних таблиц

С v3.2.0 поддержан сбор для Hive, Iceberg, Hudi (с v3.3.0 — Delta Lake; сбор статистики подполей STRUCT). Поддержаны ручной полный сбор, ручной сбор гистограмм (с v3.2.7) и автоматический полный сбор (выборочный не поддерживается). С v3.4.0 поддержан query‑triggered ANALYZE.

Ограничения и параметры авто/ручного/триггерного сбора описаны в оригинале; команды и конфигурации сохраняются в английском написании согласно принятым практикам.