Перейти к содержимому
Последнее обновление

Статистика

Статистика лежит в основе оценки стоимости в оптимизаторе Doris CBO (Cost-Based Optimizer), и её точность напрямую определяет качество плана выполнения запроса. В статье описаны способы сбора статистики, команды управления, связанные параметры конфигурации и методы устранения типичных неполадок.

Применимые версии: Doris 2.0 и более поздние.

Что нужно знать перед началом​

  • Вы знаете свою версию Doris (для автоматического сбора требуется версия 2.0.3 или более поздняя).
  • Вы определили тип целевого объекта: внутренняя таблица, Hive, Iceberg, Paimon, JDBC и т. д.
  • Вы знаете типы целевых столбцов (сбор поддерживается только для базовых типов).
  • Вы знаете, нужно ли запускать сбор вручную или использовать автоматический сбор.

Кратко об основных понятиях​

Определение в одном предложении: статистика представляет собой метаданные о распределении данных, которые Doris записывает на уровне таблиц и столбцов и которые оптимизатор использует для оценки стоимости и выбора оптимального плана.

Doris собирает статистику по каждому столбцу в пределах таблицы, включая следующие показатели:

ПоказательОписание
row_countОбщее количество строк
data_sizeОбщий объём данных столбца
avg_size_byteСредний объём данных столбца на строку
ndvКоличество уникальных значений (кардинальность)
minМинимальное значение
maxМаксимальное значение
null_countКоличество значений NULL

Поддерживаемые типы столбцов: BOOLEAN, TINYINT, SMALLINT, INT, BIGINT, LARGEINT, FLOAT, DOUBLE, DATE, DATETIME, STRING, VARCHAR, TEXT.

Не поддерживаются (автоматически пропускаются): JSONB, VARIANT, MAP, STRUCT, ARRAY, HLL, BITMAP, TIME, TIMEV2, VARBINARY.

Результаты сбора хранятся в таблице internal.__internal_schema.column_statistics.

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

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

Сравнение способов сбора​

КритерийСбор вручную (ANALYZE)Автоматический сбор (включён по умолчанию)
ЗапускПо инициативе пользователяФоновый поток периодически выполняет проверку
Сценарии использованияСрочное обновление, первоначальный сбор, отладкаРегулярное обслуживание, поддержание актуальности
Минимальная версия2.02.0.3
Стратегия выборкиЗаданное количество или доля строкПо умолчанию выбирается 4194304 строк (2^22)
Уровень управленияТаблица / база данных / столбецПереключатель на уровне кластера + политика на уровне таблицы

Сбор вручную​

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

Команда: отправьте задание на сбор вручную с помощью оператора ANALYZE. Подробности см. в справочнике SQL: ANALYZE.

Типичные примеры:

Выполнить полный сбор по всем столбцам таблицы lineitem:

ANALYZE TABLE lineitem;

Выполнить полный сбор по всем столбцам всех таблиц базы данных tpch100:

ANALYZE DATABASE tpch100;

Выполнить сбор по таблице lineitem на выборке из 100000 строк:

ANALYZE TABLE lineitem WITH SAMPLE ROWS 100000;

Выполнить сбор по столбцам l_orderkey и l_linenumber таблицы lineitem на выборке из 100000 строк:

ANALYZE TABLE lineitem (l_orderkey, l_linenumber) WITH SAMPLE ROWS 100000;

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

Назначение: периодически выполнять проверку в фоновом потоке и автоматически поддерживать актуальность статистики.

Переключатель: управляется переменной ENABLE_AUTO_ANALYZE.

SET GLOBAL ENABLE_AUTO_ANALYZE = TRUE;  -- Enable auto collection
SET GLOBAL ENABLE_AUTO_ANALYZE = FALSE; -- Disable auto collection

Механизм работы​

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

  1. В таблице есть столбцы без статистики.
  2. Показатель актуальности статистики таблицы ниже порогового значения (по умолчанию 90, задаётся переменной table_stats_health_threshold). Чем ближе показатель к 100, тем меньше изменились данные; значение ниже 90 означает, что статистика значительно расходится с текущими данными и её необходимо собрать повторно.
  3. Для внутренних таблиц: данные изменились, но за последние 24 часа статистика не собиралась.

Интервал проверки: по умолчанию 5 минут (задаётся параметром auto_check_statistics_in_minutes в fe.conf). Первый цикл начинается через 5 минут после запуска кластера. После завершения каждого цикла поток приостанавливается на 5 минут, а затем начинает следующий цикл.

Примечание

Продолжительность одного цикла зависит от количества таблиц и объёма данных; сбор статистики для конкретной таблицы в течение 5 минут не гарантируется.

Основные параметры​

ПараметрНазначениеПо умолчанию
auto_analyze_table_width_thresholdМаксимальное количество столбцов для автоматического сбора300
huge_table_default_sample_rowsКоличество строк в выборке для автоматического сбора4194304 (2^22)
auto_analyze_start_timeВремя начала автоматического сбора0:00:00
auto_analyze_end_timeВремя окончания автоматического сбора23:59:59

Изменить ограничение для широких таблиц (чтобы таблицы с большим количеством столбцов не потребляли слишком много ресурсов):

SET GLOBAL auto_analyze_table_width_threshold = 350;

Выполнять сбор в часы низкой нагрузки (чтобы избежать влияния на рабочие процессы):

SET GLOBAL auto_analyze_start_time = "03:00:00"; -- Start time: 3:00 AM
SET GLOBAL auto_analyze_end_time = "14:00:00"; -- End time: 2:00 PM

Для получения более точных сведений о распределении данных можно увеличить huge_table_default_sample_rows, увеличив тем самым количество строк в выборке.

Сбор статистики внешних таблиц​

Типы внешних таблиц: обычно Hive, Iceberg, JDBC, Paimon и т. д.

Матрица возможностей​

Тип внешней таблицыПолный сбор вручнуюСбор по выборке вручнуюАвтоматический сбор
HiveПоддерживаетсяПоддерживаетсяПоддерживается
IcebergПоддерживаетсяНе поддерживаетсяНе поддерживается
JDBCПоддерживаетсяНе поддерживаетсяНе поддерживается
ДругиеНе поддерживаетсяНе поддерживаетсяНе поддерживается

Поведение по умолчанию​

Внешние объекты Catalog по умолчанию не участвуют в автоматическом сборе статистики по столбцам; собирается только количество строк в таблицах, чтобы избежать избыточного сканирования исторических данных. Чтобы включить автоматический сбор статистики по столбцам:

ALTER CATALOG <catalog_name> SET PROPERTIES ('enable.auto.analyze'='true');  -- Enable
ALTER CATALOG <catalog_name> SET PROPERTIES ('enable.auto.analyze'='false'); -- Disable

Управление на уровне таблицы (имеет приоритет над свойством Catalog):

ALTER TABLE <table_name> SET ("auto_analyze_policy" = "enable");          -- Enable
ALTER TABLE <table_name> SET ("auto_analyze_policy" = "disable"); -- Disable
ALTER TABLE <table_name> SET ("auto_analyze_policy" = "base_on_catalog"); -- Follow the catalog

Для внешних таблиц показатель актуальности не используется. После включения автоматического сбора статистика внешней таблицы по умолчанию собирается не чаще одного раза в 24 часа. Минимальный интервал можно изменить с помощью external_table_auto_analyze_interval_in_millis.

Стратегия оценки количества строк​

Тип внешней таблицыМетод оценки
HiveСначала берётся numRows из Parameters; если значение отсутствует, для оценки используются totalSize и схема; если и этих данных нет, оценка выполняется по размеру файлов
IcebergВызов API снимков для получения total-records и total-position-deletes, используемых в расчёте
PaimonВызов API сканирования для суммирования количества строк в каждом фрагменте
JDBCПолучение с помощью команды определения количества строк в подключённой базе данных (поддерживаются MySQL, Oracle, PostgreSQL, SQLServer)
ДругиеАвтоматическое получение и оценка пока не поддерживаются

Если получение размеров файлов потребляет слишком много ресурсов, можно отключить оценку по размеру файлов для Hive:

SET GLOBAL enable_get_row_count_from_file_list = FALSE;

Просмотреть оценочное количество строк во внешней таблице:

SHOW TABLE STATS table_name;
Совет

Если row_count показывает -1, количество строк не удалось получить либо таблица пуста.

Управление заданиями сбора статистики​

Просмотр заданий сбора статистики​

Назначение: просмотр отправленных асинхронных заданий сбора статистики (история синхронных заданий не сохраняется).

Команда:

SHOW ANALYZE [job_id];

Подробности см. в разделе SHOW ANALYZE.

Примечание: система хранит историю только 20000 заданий. Значения столбцов вывода:

СтолбецОписание
job_idИдентификатор задания сбора статистики
catalog_nameИмя Catalog
db_nameИмя базы данных
tbl_nameИмя таблицы
col_nameСписок имён столбцов (index_name:column_name)
job_typeТип задания
analysis_typeТип статистики
messageСообщение задания
stateСостояние задания
progressХод выполнения задания
schedule_typeТип планирования
start_timeВремя начала задания
end_timeВремя окончания задания

Пример:

mysql> SHOW ANALYZE 245073\G
*************************** 1. row ***************************
job_id: 93021
catalog_name: internal
db_name: tpch
tbl_name: region
col_name: [region:r_regionkey,region:r_comment,region:r_name]
job_type: MANUAL
analysis_type: FUNDAMENTALS
message:
state: FINISHED
progress: 3 Finished | 0 Failed | 0 In Progress | 3 Total
schedule_type: ONCE
start_time: 2024-07-11 15:15:00
end_time: 2024-07-11 15:15:33

Просмотр задач сбора статистики​

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

Команда:

SHOW ANALYZE TASK STATUS [job_id];

Пример:

mysql> SHOW ANALYZE TASK STATUS 93021;
+---------+-------------+------------+---------+------------------------+-----------------+----------+
| task_id | col_name | index_name | message | last_state_change_time | time_cost_in_ms | state |
+---------+-------------+------------+---------+------------------------+-----------------+----------+
| 93022 | r_regionkey | region | | 2024-07-11 15:15:33 | 32883 | FINISHED |
| 93023 | r_comment | region | | 2024-07-11 15:15:33 | 32883 | FINISHED |
| 93024 | r_name | region | | 2024-07-11 15:15:33 | 32883 | FINISHED |
+---------+-------------+------------+---------+------------------------+-----------------+----------+

Просмотр статистики столбцов​

Назначение: просмотр собранной статистики на уровне столбцов.

Команда:

SHOW COLUMN [cached] STATS table_name [ (column_name [, ...]) ];

Параметры:

ПараметрОписание
cachedПоказать только статистику из кеша в памяти FE
table_nameЦелевая таблица; можно указать в виде db_name.table_name
column_nameЦелевой столбец (можно указать несколько столбцов через запятую); если не указан, выводятся все столбцы

Пример:

mysql> SHOW COLUMN STATS region (r_regionkey)\G
*************************** 1. row ***************************
column_name: r_regionkey
index_name: region
count: 5.0
ndv: 5.0
num_null: 0.0
data_size: 20.0
avg_size_byte: 4.0
min: 0
max: 4
method: FULL
type: FUNDAMENTALS
trigger: MANUAL
query_times: 0
updated_time: 2024-07-11 15:15:33
1 row in set (0.36 sec)

Просмотр сводки статистики таблицы​

Назначение: просмотр сводных сведений о сборе статистики на уровне таблицы.

Команда:

SHOW TABLE STATS table_name;

table_name можно указать в виде db_name.table_name.

Столбцы вывода:

СтолбецОписание
updated_rowsКоличество строк таблицы, обновлённых после последнего ANALYZE
query_timesЗарезервированный столбец для учёта количества запросов в будущих версиях
row_countКоличество строк в таблице (может не соответствовать точному количеству строк на момент выполнения команды)
updated_timeВремя последнего обновления статистики
columnsСтолбцы, для которых собрана статистика
triggerСпособ запуска сбора статистики
new_partitionЕсть ли новая партиция, в которую впервые загружены данные
user_injectВведена ли статистика пользователем вручную

Прекращение заданий сбора статистики​

Назначение: прекращение выполняющегося асинхронного задания сбора статистики.

Команда:

KILL ANALYZE job_id;

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

Пример: прекратить задание сбора статистики с идентификатором 52357.

mysql> KILL ANALYZE 52357;

Удаление статистики​

Назначение: ручная очистка статистики существующей таблицы. Статистика удалённых объектов периодически очищается в фоновом режиме и не требует действий пользователя.

Команда:

DROP STATS table_name;

Переменные сеанса и параметры конфигурации​

Переменные сеанса​

Переменная сеансаОписаниеПо умолчанию
auto_analyze_start_timeВремя начала автоматического сбора0:00:00
auto_analyze_end_timeВремя окончания автоматического сбора23:59:59
enable_auto_analyzeВключён ли автоматический сборTRUE
huge_table_default_sample_rowsКоличество строк в выборке для больших таблиц4194304
table_stats_health_thresholdДиапазон 0-100; статистика считается устаревшей при изменении (100 - порог)% данных90
auto_analyze_table_width_thresholdМаксимальное количество столбцов для автоматического сбора; таблицы с большим количеством столбцов исключаются300
enable_get_row_count_from_file_listОценивать ли количество строк в таблицах Hive по размеру файловTRUE (до 2.1.5 по умолчанию FALSE)

Параметры конфигурации FE​

Примечание

Следующие параметры конфигурации FE обычно не требуют особого внимания.

Параметр конфигурации FEОписаниеПо умолчанию
analyze_record_limitОпределяет количество сохраняемых записей о выполнении заданий сбора статистики20000
stats_cache_sizeКоличество записей в кеше статистики на стороне FE500000
statistics_simultaneously_running_task_numКоличество асинхронных заданий сбора статистики, которые могут выполняться одновременно3
statistics_sql_mem_limit_in_bytesОбъём памяти BE, доступный каждому SQL-запросу сбора статистики2L * 1024 * 1024 (2 GiB)

Часто задаваемые вопросы (FAQ)​

Вопрос 1: Как проверить, собрана ли статистика по таблице?​

Шаг 1: проверьте наличие результатов сбора.

SHOW COLUMN STATS table_name;

Шаг 2: проверьте, загружена ли статистика в кеш FE.

SHOW COLUMN CACHED STATS table_name;

Если оба результата пусты, у таблицы сейчас нет статистики. Пример вывода при наличии собранной статистики:

mysql> SHOW COLUMN CACHED STATS mvTestDup;
+-------------+------------+-------+------+----------+-----------+---------------+------+------+--------+--------------+---------+-------------+---------------------+
| column_name | index_name | count | ndv | num_null | data_size | avg_size_byte | min | max | method | type | trigger | query_times | updated_time |
+-------------+------------+-------+------+----------+-----------+---------------+------+------+--------+--------------+---------+-------------+---------------------+
| key1 | mvTestDup | 6.0 | 4.0 | 0.0 | 48.0 | 8.0 | 1 | 1001 | FULL | FUNDAMENTALS | MANUAL | 0 | 2024-07-22 10:53:25 |
| key2 | mvTestDup | 6.0 | 4.0 | 0.0 | 48.0 | 8.0 | 2 | 2001 | FULL | FUNDAMENTALS | MANUAL | 0 | 2024-07-22 10:53:25 |
| value2 | mvTestDup | 6.0 | 4.0 | 0.0 | 24.0 | 4.0 | 4 | 4001 | FULL | FUNDAMENTALS | MANUAL | 0 | 2024-07-22 10:53:25 |
| value1 | mvTestDup | 6.0 | 4.0 | 0.0 | 24.0 | 4.0 | 3 | 3001 | FULL | FUNDAMENTALS | MANUAL | 0 | 2024-07-22 10:53:25 |
| mv_key1 | mv1 | 6.0 | 4.0 | 0.0 | 48.0 | 8.0 | 1 | 1001 | FULL | FUNDAMENTALS | MANUAL | 0 | 2024-07-22 10:53:25 |
| value3 | mvTestDup | 6.0 | 4.0 | 0.0 | 24.0 | 4.0 | 5 | 5001 | FULL | FUNDAMENTALS | MANUAL | 0 | 2024-07-22 10:53:25 |
+-------------+------------+-------+------+----------+-----------+---------------+------+------+--------+--------------+---------+-------------+---------------------+
6 rows in set (0.00 sec)

Шаг 3: проверьте точность, выполнив SQL вручную.

SELECT count(1), ndv(col1), min(col1), max(col1) FROM table;

Если различие между count и ndv не превышает одного порядка величины, точность считается приемлемой.

Вопрос 2: Почему статистика по таблице никогда не собирается автоматически?​

Проверка 1: включён ли автоматический сбор.

SHOW VARIABLES LIKE "enable_auto_analyze";
-- If false, enable it:
SET GLOBAL enable_auto_analyze = TRUE;

Проверка 2: не превышает ли количество столбцов в таблице значение auto_analyze_table_width_threshold (по умолчанию 300). Таблицы, превышающие этот предел, исключаются из автоматического сбора.

SHOW VARIABLES LIKE "auto_analyze_table_width_threshold";
-- If smaller than the table width, adjust:
SET GLOBAL auto_analyze_table_width_threshold = 350;

Проверка 3: выполняются ли другие задания.

SHOW AUTO ANALYZE;

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

Вопрос 3: Почему для некоторых столбцов нет статистики?​

Сбор статистики поддерживается только для столбцов базовых типов. Сложные типы (например, JSONB, VARIANT, MAP, STRUCT, ARRAY, HLL, BITMAP, TIME, TIMEV2, VARBINARY) автоматически пропускаются.

Вопрос 4: Ошибка Stats table not available, please make sure your cluster status is normal​

Обычно это означает, что внутренняя таблица статистики находится в неисправном состоянии. Порядок диагностики:

Шаг 1: проверьте, все ли BE работают нормально.

Шаг 2: получите все tabletId таблицы статистики.

SHOW TABLETS FROM internal.__internal_schema.column_statistics;

Шаг 3: выполните диагностику каждого tablet по очереди.

ADMIN DIAGNOSE TABLET tablet_id;

Шаг 4: после устранения проблем с tablet повторно соберите статистику.

Вопрос 5: Что делать, если статистика собирается недостаточно своевременно?​

  • Если обновление требуется срочно: выполните ANALYZE для целевой таблицы вручную.
  • Измените порог актуальности: значение по умолчанию table_stats_health_threshold = 90 означает, что сбор запускается только при изменении более 10% данных. Можно повысить его до 95 (тогда сбор будет запускаться при изменении более 5% данных):
SET GLOBAL table_stats_health_threshold = 95;

Вопрос 6: Что делать, если автоматический сбор потребляет слишком много ресурсов?​

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

  • Таблицы с большим количеством партиций.
  • Таблицы с очень крупными отдельными tablet.

Рекомендации по оптимизации:

  1. При создании таблицы разумно планируйте количество tablet и не допускайте чрезмерного размера отдельных tablet.
  2. Включайте автоматический сбор в часы низкой нагрузки на систему (см. auto_analyze_start_time / auto_analyze_end_time).
  3. Для больших таблиц выполняйте сбор вручную в часы низкой нагрузки.
  4. В линейке Doris 3.x такие сценарии будут дополнительно оптимизированы.
На этой странице