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

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

Эта тема описывает базовую концепцию оптимизатора на основе стоимости (CBO) Selena и как собирать статистику для CBO для выбора оптимального плана запроса. Selena 2.4 вводит гистограммы для сбора точной статистики распределения данных.

Начиная с версии 1.5.0, Selena поддерживает сбор статистики из таблиц Hive, Iceberg и Hudi, снижая зависимость от других систем метаданных. Синтаксис аналогичен сбору внутренних таблиц Selena.

Что такое CBO

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

CBO Selena был запущен в Selena 1.16.0 и включен по умолчанию начиная с версии 1.19. Разработанный на основе фреймворка Cascades, CBO Selena оценивает стоимость на основе различной статистической информации. Он способен выбирать план выполнения с наименьшей стоимостью среди десятков тысяч планов выполнения, значительно улучшая эффективность и производительность сложных запросов.

Статистика важна для CBO. Она определяет, является ли оценка стоимости точной и полезной. Следующие разделы подробно описывают типы статистической информации, политику сбора и как собирать статистику и просматривать статистическую информацию.

Типы статистической информации

Selena собирает различную статистику в качестве входных данных для оценки стоимости.

Базовая статистика

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

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

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

  • ndv: кардинальность столбца, которая является количеством различных значений в столбце

  • null_count: количество данных со значениями NULL в столбце

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

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

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

SELECT * FROM _statistics_.column_statistics\G
*************************** 1. row ***************************
table_id: 10174
partition_id: 10170
column_name: is_minor
db_id: 10169
table_name: zj_test.source_wiki_edit
partition_name: p06
row_count: 2
data_size: 2
ndv: NULL
null_count: 0
max: 1
min: 0

Гистограмма

Selena 2.4 вводит гистограммы для дополнения базовой статистики. Гистограмма считается эффективным способом представления данных. Для таблиц со смещенными данными гистограммы могут точно отражать распределение данных.

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

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

В настоящее время Selena поддерживает только ручной сбор гистограмм. Гистограммы хранятся в таблице histogram_statistics базы данных _statistics_. Ниже приведен пример запроса статистических данных из этой таблицы:

SELECT * FROM _statistics_.histogram_statistics\G
*************************** 1. row ***************************
table_id: 10174
column_name: added
db_id: 10169
table_name: zj_test.source_wiki_edit
buckets: NULL
mcv: [["23","1"],["5","1"]]
update_time: 2023-12-01 15:17:10.274000

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

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

Selena поддерживает полный и выборочный сбор, оба могут выполняться автоматически и вручную. По умолчанию Selena автоматически собирает полную статистику таблицы. Она проверяет наличие обновлений данных каждые 5 минут. Если обнаружено изменение данных, автоматически запускается сбор данных. Если вы не хотите использовать автоматический полный сбор, вы можете настроить задачу сбора.

Тип сбораМетод сбораОписаниеПреимущества и недостатки
Полный сборАвтоматический/ручнойСканирует всю таблицу для сбора статистики. Статистика собирается по разделам. Если в разделе нет изменений данных, данные не будут собираться из этого раздела, что снижает потребление ресурсов. Полная статистика хранится в таблице _statistics_.column_statistics.Преимущество: Статистика точная, что помогает CBO делать точные оценки. Недостаток: Потребляет системные ресурсы и медленный. Начиная с версии 1.5.0, Selena позволяет указать период автоматического сбора, что снижает потребление ресурсов.
Выборочный сборАвтоматический/ручнойРавномерно извлекает N строк данных из каждого раздела таблицы. Статистика собирается по таблице. Базовая статистика каждого столбца хранится как одна запись. Информация о кардинальности (ndv) столбца оценивается на основе выборочных данных, что не является точным. Выборочная статистика хранится в таблице _statistics_.table_statistic_v1.Преимущество: Потребляет меньше системных ресурсов и быстрый. Недостаток: Статистика не полная, что может повлиять на точность оценки стоимости.

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

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

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

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

Начиная с версии 1.5.0, Selena позволяет указать период сбора для автоматического полного сбора, что предотвращает колебания производительности кластера, вызванные автоматическим полным сбором. Этот период указывается параметрами FE statistic_auto_analyze_start_time и statistic_auto_analyze_end_time.

Условия, которые запускают автоматический сбор:

  • Данные таблицы изменились с момента предыдущего сбора статистики.

  • Время сбора попадает в диапазон настроенного периода сбора. (Период сбора по умолчанию - весь день.)

  • Время обновления предыдущей задачи сбора раньше последнего времени обновления разделов.

  • Здоровье статистики таблицы ниже указанного порога (statistic_auto_collect_ratio).

Формула для расчета здоровья статистики:

Если количество разделов с обновленными данными меньше 10, формула: 1 - (Количество обновленных строк с момента предыдущего сбора/Общее количество строк). Если количество разделов с обновленными данными больше или равно 10, формула: 1 - MIN(Количество обновленных строк с момента предыдущего сбора/Общее количество строк, Количество обновленных разделов с момента предыдущего сбора/Общее количество разделов).

Кроме того, Selena позволяет настраивать политики сбора на основе размера таблицы и частоты обновления таблицы:

  • Для таблиц с небольшим объемом данных **статистика собирается в реальном времени без ограничений, даже если данные таблицы часто обновляются. Параметр statistic_auto_collect_small_table_size может использоваться для определения, является ли таблица маленькой или большой. Вы также можете использовать statistic_auto_collect_small_table_interval для настройки интервалов сбора для маленьких таблиц.

  • Для таблиц с большим объемом данных применяются следующие ограничения:

    • Интервал сбора по умолчанию составляет не менее 12 часов, который можно настроить с помощью statistic_auto_collect_large_table_interval.

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

    • Когда интервал сбора соблюден и здоровье статистики выше порога для автоматического выборочного сбора (statistic_auto_collect_sample_threshold) и ниже порога автоматического сбора (statistic_auto_collect_ratio), запускается полный сбор.

    • Когда размер разделов для сбора данных (statistic_max_full_collect_data_size) превышает 100 ГБ, запускается выборочный сбор.

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

подсказка

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

Автоматический полный сбор включен по умолчанию и выполняется системой с использованием настроек по умолчанию.

В следующей таблице описаны настройки по умолчанию. Если вам нужно их изменить, выполните команду ADMIN SET CONFIG.

Элемент конфигурации FEТипЗначение по умолчаниюОписание
enable_statistic_collectBOOLEANTRUEСобирать ли статистику. Этот переключатель включен по умолчанию.
enable_collect_full_statisticBOOLEANTRUEВключить ли автоматический полный сбор. Этот переключатель включен по умолчанию.
statistic_collect_interval_secLONG300Интервал для проверки обновлений данных во время автоматического сбора. Единица: секунды.
statistic_auto_analyze_start_timeSTRING00:00:00Время начала автоматического сбора. Диапазон значений: 00:00:00 - 23:59:59.
statistic_auto_analyze_end_timeSTRING23:59:59Время окончания автоматического сбора. Диапазон значений: 00:00:00 - 23:59:59.
statistic_auto_collect_small_table_sizeLONG5368709120Порог для определения, является ли таблица маленькой для автоматического полного сбора. Таблица, размер которой больше этого значения, считается большой, тогда как таблица, размер которой меньше или равен этому значению, считается маленькой. Единица: Байт. Значение по умолчанию: 5368709120 (5 ГБ).
statistic_auto_collect_small_table_intervalLONG0Интервал для автоматического сбора полной статистики маленьких таблиц. Единица: секунды.
statistic_auto_collect_large_table_intervalLONG43200Интервал для автоматического сбора полной статистики больших таблиц. Единица: секунды. Значение по умолчанию: 43200 (12 часов).
statistic_auto_collect_ratioFLOAT0.8Порог для определения здоровья статистики для автоматического сбора. Если здоровье статистики ниже этого порога, запускается автоматический сбор.
statistic_auto_collect_sample_thresholdDOUBLE0.3Порог здоровья статистики для запуска автоматического выборочного сбора. Если значение здоровья статистики ниже этого порога, запускается автоматический выборочный сбор.
statistic_max_full_collect_data_sizeLONG107374182400Размер данных разделов для автоматического сбора данных. Единица: Байт. Значение по умолчанию: 107374182400 (100 ГБ). Если размер данных превышает это значение, полный сбор отменяется и вместо него выполняется выборочный сбор.
statistic_full_collect_bufferLONG20971520Максимальный размер буфера, занимаемый задачами автоматического сбора. Единица: Байт. Значение по умолчанию: 20971520 (20 МБ).
statistic_collect_max_row_count_per_queryINT5000000000Максимальное количество строк для запроса в одной задаче анализа. Задача анализа будет разделена на несколько запросов, если это значение превышено.
statistic_collect_too_many_version_sleepLONG600000Время сна задач автоматического сбора, если таблица, на которой выполняется задача сбора, имеет слишком много версий данных. Единица: мс. Значение по умолчанию: 600000 (10 минут).

Вы можете полагаться на автоматические задачи для большинства сборов статистики, но если у вас есть специфические требования, вы можете вручную создать задачу, выполнив оператор ANALYZE TABLE, или настроить автоматическую задачу, выполнив оператор CREATE ANALYZE.

Ручной сбор

Вы можете использовать ANALYZE TABLE для создания задачи ручного сбора. По умолчанию ручной сбор является синхронной операцией. Вы также можете установить его как асинхронную операцию. В асинхронном режиме после выполнения ANALYZE TABLE система немедленно возвращает информацию об успешности этого оператора. Однако задача сбора будет выполняться в фоновом режиме, и вам не нужно ждать результата. Вы можете проверить статус задачи, выполнив SHOW ANALYZE STATUS. Асинхронный сбор подходит для таблиц с большим объемом данных, тогда как синхронный сбор подходит для таблиц с небольшим объемом данных. Задачи ручного сбора выполняются только один раз после создания. Вам не нужно удалять задачи ручного сбора. Вы должны иметь привилегии INSERT и SELECT на соответствующей таблице для выполнения операции ANALYZE TABLE.

Ручной сбор базовой статистики

ANALYZE [FULL|SAMPLE] TABLE tbl_name (col_name [,col_name])
[WITH SYNC | ASYNC MODE]
[PROPERTIES (property [,property])]

Описание параметров:

  • Тип сбора

    • FULL: указывает полный сбор.
    • SAMPLE: указывает выборочный сбор.
    • Если тип сбора не указан, по умолчанию используется полный сбор.
  • col_name: столбцы, из которых собирается статистика. Разделите несколько столбцов запятыми (,). Если этот параметр не указан, собирается вся таблица.

  • [WITH SYNC | ASYNC MODE]: выполнять ли задачу ручного сбора в синхронном или асинхронном режиме. Синхронный сбор используется по умолчанию, если вы не указываете этот параметр.

  • PROPERTIES: пользовательские параметры. Если PROPERTIES не указано, используются настройки по умолчанию в файле fe.conf. Фактически используемые свойства можно просмотреть через столбец Properties в выводе SHOW ANALYZE STATUS.

PROPERTIESТипЗначение по умолчаниюОписание
statistic_sample_collect_rowsINT200000Минимальное количество строк для сбора при выборочном сборе. Если значение параметра превышает фактическое количество строк в вашей таблице, выполняется полный сбор.

Примеры

Ручной полный сбор

-- Ручной сбор полной статистики таблицы с использованием настроек по умолчанию.
ANALYZE TABLE tbl_name;

-- Ручной сбор полной статистики таблицы с использованием настроек по умолчанию.
ANALYZE FULL TABLE tbl_name;

-- Ручной сбор статистики указанных столбцов в таблице с использованием настроек по умолчанию.
ANALYZE TABLE tbl_name(c1, c2, c3);

Ручной выборочный сбор

-- Ручной сбор частичной статистики таблицы с использованием настроек по умолчанию.
ANALYZE SAMPLE TABLE tbl_name;

-- Ручной сбор статистики указанных столбцов в таблице с указанием количества строк для сбора.
ANALYZE SAMPLE TABLE tbl_name (v1, v2, v3) PROPERTIES(
"statistic_sample_collect_rows" = "1000000"
);

Ручной сбор гистограмм

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

Описание параметров:

  • col_name: столбцы, из которых собирается статистика. Разделите несколько столбцов запятыми (,). Если этот параметр не указан, собирается вся таблица. Этот параметр обязателен для гистограмм.

  • [WITH SYNC | ASYNC MODE]: выполнять ли задачу ручного сбора в синхронном или асинхронном режиме. Синхронный сбор используется по умолчанию, если вы не указываете этот параметр.

  • WITH N BUCKETS: N - это количество корзин для сбора гистограммы. Если не указано, используется значение по умолчанию в fe.conf.

  • PROPERTIES: пользовательские параметры. Если PROPERTIES не указано, используются настройки по умолчанию в fe.conf.

PROPERTIESТипЗначение по умолчаниюОписание
statistic_sample_collect_rowsINT200000Минимальное количество строк для сбора. Если значение параметра превышает фактическое количество строк в вашей таблице, выполняется полный сбор.
histogram_buckets_sizeLONG64Количество корзин по умолчанию для гистограммы.
histogram_mcv_sizeINT100Количество наиболее распространенных значений (MCV) для гистограммы.
histogram_sample_ratioFLOAT0.1Коэффициент выборки для гистограммы.
histogram_max_sample_row_countLONG10000000Максимальное количество строк для сбора для гистограммы.

Количество строк для сбора для гистограммы контролируется несколькими параметрами. Это большее значение между statistic_sample_collect_rows и количество строк таблицы * histogram_sample_ratio. Число не может превышать значение, указанное в histogram_max_sample_row_count. Если значение превышено, приоритет имеет histogram_max_sample_row_count.

Фактически используемые свойства можно просмотреть через столбец Properties в выводе SHOW ANALYZE STATUS.

Примеры

-- Ручной сбор гистограмм по v1 с использованием настроек по умолчанию.
ANALYZE TABLE tbl_name UPDATE HISTOGRAM ON v1;

-- Ручной сбор гистограмм по v1 и v2 с 32 корзинами, 32 MCV и 50% коэффициентом выборки.
ANALYZE TABLE tbl_name UPDATE HISTOGRAM ON v1,v2 WITH 32 BUCKETS
PROPERTIES(
"histogram_mcv_size" = "32",
"histogram_sample_ratio" = "0.5"
);

Пользовательский сбор

Настройка автоматической задачи сбора

Вы можете использовать оператор CREATE ANALYZE для настройки автоматической задачи сбора. Вы должны иметь привилегии INSERT и SELECT на соответствующей таблице для выполнения операции ANALYZE TABLE.

-- Автоматический сбор статистики всех баз данных.
CREATE ANALYZE [FULL|SAMPLE] ALL [PROPERTIES (property [,property])]

-- Автоматический сбор статистики всех таблиц в базе данных.
CREATE ANALYZE [FULL|SAMPLE] DATABASE db_name
[PROPERTIES (property [,property])]

-- Автоматический сбор статистики указанных столбцов в таблице.
CREATE ANALYZE [FULL|SAMPLE] TABLE tbl_name (col_name [,col_name])
[PROPERTIES (property [,property])]

Описание параметров:

  • Тип сбора

    • FULL: указывает полный сбор.
    • SAMPLE: указывает выборочный сбор.
    • Если тип сбора не указан, по умолчанию используется выборочный сбор.
  • col_name: столбцы, из которых собирается статистика. Разделите несколько столбцов запятыми (,). Если этот параметр не указан, собирается вся таблица.

  • PROPERTIES: пользовательские параметры. Если PROPERTIES не указано, используются настройки по умолчанию в fe.conf.

PROPERTIESТипЗначение по умолчаниюОписание
statistic_auto_collect_ratioFLOAT0.8Порог для определения здоровья статистики для автоматического сбора. Если здоровье статистики ниже этого порога, запускается автоматический сбор.
statistics_max_full_collect_data_sizeINT100Размер самого большого раздела для автоматического сбора данных. Единица: ГБ. Если раздел превышает это значение, полный сбор отменяется и вместо него выполняется выборочный сбор.
statistic_sample_collect_rowsINT200000Минимальное количество строк для сбора. Если значение параметра превышает фактическое количество строк в вашей таблице, выполняется полный сбор.
statistic_exclude_patternStringnullИмя базы данных или таблицы, которую нужно исключить в задаче. Вы можете указать базу данных и таблицу, которые не собирают статистику в задаче. Обратите внимание, что это шаблон регулярного выражения, и содержимое совпадения - database.table.
statistic_auto_collect_intervalLONG0Интервал для автоматического сбора. Единица: секунды. По умолчанию Selena выбирает statistic_auto_collect_small_table_interval или statistic_auto_collect_large_table_interval в качестве интервала сбора на основе размера таблицы. Если вы указали свойство statistic_auto_collect_interval при создании задачи анализа, эта настройка имеет приоритет над statistic_auto_collect_small_table_interval и statistic_auto_collect_large_table_interval.

Примеры

Автоматический полный сбор

-- Автоматический сбор полной статистики всех баз данных.
CREATE ANALYZE ALL;

-- Автоматический сбор полной статистики базы данных.
CREATE ANALYZE DATABASE db_name;

-- Автоматический сбор полной статистики всех таблиц в базе данных.
CREATE ANALYZE FULL DATABASE db_name;

-- Автоматический сбор полной статистики указанных столбцов в таблице.
CREATE ANALYZE TABLE tbl_name(c1, c2, c3);

-- Автоматический сбор статистики всех баз данных, исключая указанную базу данных 'db_name'.
CREATE ANALYZE ALL PROPERTIES (
"statistic_exclude_pattern" = "db_name\."
);

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

-- Автоматический сбор статистики всех таблиц в базе данных с настройками по умолчанию.
CREATE ANALYZE SAMPLE DATABASE db_name;

-- Автоматический сбор статистики всех таблиц в базе данных, исключая указанную таблицу 'db_name.tbl_name'.
CREATE ANALYZE SAMPLE DATABASE db_name PROPERTIES (
"statistic_exclude_pattern" = "db_name.tbl_name"
);

-- Автоматический сбор статистики указанных столбцов в таблице с указанием здоровья статистики и количества строк для сбора.
CREATE ANALYZE SAMPLE TABLE tbl_name(c1, c2, c3) PROPERTIES (
"statistic_auto_collect_ratio" = "0.5",
"statistic_sample_collect_rows" = "1000000"
);

Просмотр пользовательских задач сбора

SHOW ANALYZE JOB [WHERE predicate]

Вы можете фильтровать результаты, используя предложение WHERE. Оператор возвращает следующие столбцы.

СтолбецОписание
IdID задачи сбора.
DatabaseИмя базы данных.
TableИмя таблицы.
ColumnsИмена столбцов.
TypeТип статистики, включая FULL и SAMPLE.
ScheduleТип планирования. Тип SCHEDULE для автоматической задачи.
PropertiesПользовательские параметры.
StatusСтатус задачи, включая PENDING, RUNNING, SUCCESS и FAILED.
LastWorkTimeВремя последнего сбора.
ReasonПричина сбоя задачи. NULL возвращается, если выполнение задачи было успешным.

Примеры

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

-- Просмотр пользовательских задач сбора базы данных `test`.
SHOW ANALYZE JOB where `database` = 'test';

Удаление пользовательской задачи сбора

DROP ANALYZE <ID>

ID задачи можно получить с помощью оператора SHOW ANALYZE JOB.

Примеры

DROP ANALYZE 266030;

Просмотр статуса задач сбора

Вы можете просмотреть статус всех текущих задач, выполнив оператор SHOW ANALYZE STATUS. Этот оператор нельзя использовать для просмотра статуса пользовательских задач сбора. Для просмотра статуса пользовательских задач сбора используйте SHOW ANALYZE JOB.

SHOW ANALYZE STATUS [WHERE predicate];

Вы можете использовать LIKE или WHERE для фильтрации возвращаемой информации.

Этот оператор возвращает следующие столбцы.

Имя спискаОписание
IdID задачи сбора.
DatabaseИмя базы данных.
TableИмя таблицы.
ColumnsИмена столбцов.
TypeТип статистики, включая FULL, SAMPLE и HISTOGRAM.
ScheduleТип планирования. ONCE означает ручной, а SCHEDULE означает автоматический.
StatusСтатус задачи.
StartTimeВремя начала выполнения задачи.
EndTimeВремя окончания выполнения задачи.
PropertiesПользовательские параметры.
ReasonПричина сбоя задачи. NULL возвращается, если выполнение было успешным.

Просмотр статистики

Просмотр метаданных базовой статистики

SHOW STATS META [WHERE predicate]

Этот оператор возвращает следующие столбцы.

СтолбецОписание
DatabaseИмя базы данных.
TableИмя таблицы.
ColumnsИмена столбцов.
TypeТип статистики. FULL означает полный сбор, а SAMPLE означает выборочный сбор.
UpdateTimeВремя последнего обновления статистики для текущей таблицы.
PropertiesПользовательские параметры.
HealthyЗдоровье статистической информации.

Просмотр метаданных гистограмм

SHOW HISTOGRAM META [WHERE predicate]

Этот оператор возвращает следующие столбцы.

СтолбецОписание
DatabaseИмя базы данных.
TableИмя таблицы.
ColumnСтолбцы.
TypeТип статистики. Значение HISTOGRAM для гистограмм.
UpdateTimeВремя последнего обновления статистики для текущей таблицы.
PropertiesПользовательские параметры.

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

Вы можете удалить статистическую информацию, которая вам не нужна. При удалении статистики удаляются как данные, так и метаданные статистики, а также статистика в истекшем кэше. Обратите внимание, что если выполняется автоматическая задача сбора, ранее удаленная статистика может быть собрана снова. Вы можете использовать SHOW ANALYZE STATUS для просмотра истории задач сбора.

Удаление базовой статистики

DROP STATS tbl_name

Удаление гистограмм

ANALYZE TABLE tbl_name DROP HISTOGRAM ON col_name [, col_name]

Отмена задачи сбора

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

KILL ANALYZE <ID>

ID задачи для ручной задачи сбора можно получить из SHOW ANALYZE STATUS. ID задачи для пользовательской задачи сбора можно получить из SHOW ANALYZE SHOW ANALYZE JOB.

Другие элементы конфигурации FE

Элемент конфигурации FEТипЗначение по умолчаниюОписание
statistic_manager_sleep_time_secLONG60Интервал планирования метаданных. Единица: секунды. Система выполняет следующие операции на основе этого интервала: Создание таблиц для хранения статистики. Удаление удаленной статистики. Удаление истекшей статистики.
statistic_analyze_status_keep_secondLONG259200Продолжительность сохранения истории задач сбора. Единица: секунды. Значение по умолчанию: 259200 (3 дня).

Переменная сессии

statistic_collect_parallel: Используется для настройки параллелизма задач сбора статистики, которые могут выполняться на BE. Значение по умолчанию: 1. Вы можете увеличить это значение для ускорения задач сбора.

Сбор статистики таблиц Hive/Iceberg/Hudi

Начиная с версии 1.5.0, Selena поддерживает сбор статистики таблиц Hive, Iceberg и Hudi. Синтаксис аналогичен сбору внутренних таблиц Selena. Однако поддерживаются только ручной полный сбор, ручной сбор гистограмм (начиная с версии 1.5.0) и автоматический полный сбор. Выборочный сбор не поддерживается. Начиная с версии 1.5.0, Selena поддерживает сбор статистики подполей в STRUCT.

Собранная статистика хранится в таблице external_column_statistics базы данных _statistics_ в default_catalog. Она не хранится в Hive Metastore и не может быть разделена другими поисковыми системами. Вы можете запросить данные из таблицы default_catalog._statistics_.external_column_statistics, чтобы проверить, собрана ли статистика для таблицы Hive/Iceberg/Hudi.

Ниже приведен пример запроса статистических данных из external_column_statistics.

SELECT * FROM _statistics_.external_column_statistics\G
*************************** 1. row ***************************
table_uuid: hive_catalog.tn_test.ex_hive_tbl.1673596430
partition_name:
column_name: k1
catalog_name: hive_catalog
db_name: tn_test
table_name: ex_hive_tbl
row_count: 3
data_size: 12
ndv: NULL
null_count: 0
max: 3
min: 2
update_time: 2023-12-01 14:57:27.137000

Ограничения

Следующие ограничения применяются при сборе статистики для таблиц Hive, Iceberg, Hudi:

  1. Вы можете собирать статистику только таблиц Hive, Iceberg и Hudi.
  2. Поддерживаются только ручной полный сбор, ручной сбор гистограмм (начиная с версии 1.5.0) и автоматический полный сбор. Выборочный сбор не поддерживается.
  3. Для автоматического сбора полной статистики системой вы должны создать задачу Analyze, что отличается от сбора статистики внутренних таблиц Selena, где система делает это в фоновом режиме по умолчанию.
  4. Для автоматических задач сбора вы можете собирать статистику только конкретной таблицы. Вы не можете собирать статистику всех таблиц в базе данных или статистику всех баз данных во внешнем каталоге.
  5. Для автоматических задач сбора Selena может обнаруживать, обновлены ли данные в таблицах Hive и Iceberg, и если да, собирать статистику только разделов, данные которых обновлены. Selena не может воспринимать, обновлены ли данные в таблицах Hudi, и может выполнять только периодический полный сбор.

Следующие примеры происходят в базе данных под внешним каталогом Hive. Если вы хотите собрать статистику таблицы Hive из default_catalog, ссылайтесь на таблицу в формате [catalog_name.][database_name.]<table_name>.

Ручной сбор

Вы можете создать задачу Analyze по требованию, и задача выполняется немедленно после ее создания.

Создание задачи ручного сбора

Синтаксис:

-- Ручной полный сбор
ANALYZE [FULL] TABLE tbl_name (col_name [,col_name])
[WITH SYNC | ASYNC MODE]
[PROPERTIES(property [,property])]

-- Ручной сбор гистограмм (начиная с версии 1.5.0)
ANALYZE TABLE tbl_name UPDATE HISTOGRAM ON col_name [, col_name]
[WITH SYNC | ASYNC MODE]
[WITH N BUCKETS]
[PROPERTIES (property [,property])]

Ниже приведен пример ручного полного сбора:

ANALYZE TABLE ex_hive_tbl(k1);
+----------------------------------+---------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+----------------------------------+---------+----------+----------+
| hive_catalog.tn_test.ex_hive_tbl | analyze | status | OK |
+----------------------------------+---------+----------+----------+

Просмотр статуса задачи

Синтаксис:

SHOW ANALYZE STATUS [LIKE | WHERE predicate]

Пример:

SHOW ANALYZE STATUS where `table` = 'ex_hive_tbl';
+-------+----------------------+-------------+---------+------+----------+---------+---------------------+---------------------+------------+--------+
| Id | Database | Table | Columns | Type | Schedule | Status | StartTime | EndTime | Properties | Reason |
+-------+----------------------+-------------+---------+------+----------+---------+---------------------+---------------------+------------+--------+
| 16400 | hive_catalog.tn_test | ex_hive_tbl | k1 | FULL | ONCE | SUCCESS | 2023-12-04 16:31:42 | 2023-12-04 16:31:42 | {} | |
| 16465 | hive_catalog.tn_test | ex_hive_tbl | k1 | FULL | ONCE | SUCCESS | 2023-12-04 16:37:35 | 2023-12-04 16:37:35 | {} | |
| 16467 | hive_catalog.tn_test | ex_hive_tbl | k1 | FULL | ONCE | SUCCESS | 2023-12-04 16:37:46 | 2023-12-04 16:37:46 | {} | |
+-------+----------------------+-------------+---------+------+----------+---------+---------------------+---------------------+------------+--------+

Просмотр метаданных статистики

Синтаксис:

SHOW STATS META [WHERE predicate]

Пример:

SHOW STATS META where `table` = 'ex_hive_tbl';
+----------------------+-------------+---------+------+---------------------+------------+---------+
| Database | Table | Columns | Type | UpdateTime | Properties | Healthy |
+----------------------+-------------+---------+------+---------------------+------------+---------+
| hive_catalog.tn_test | ex_hive_tbl | k1 | FULL | 2023-12-04 16:37:46 | {} | |
+----------------------+-------------+---------+------+---------------------+------------+---------+

Отмена задачи сбора

Отменяет выполняющуюся задачу сбора.

Синтаксис:

KILL ANALYZE <ID>

Вы можете просмотреть ID задачи в выводе SHOW ANALYZE STATUS.

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

Для автоматического сбора статистики таблиц во внешнем источнике данных системой вы можете создать задачу Analyze. Selena автоматически проверяет, нужно ли выполнять задачу с интервалом проверки по умолчанию 5 минут. Для таблиц Hive и Iceberg Selena выполняет задачу сбора только при обновлении данных в таблицах.

Однако изменения данных в таблицах Hudi не могут быть восприняты, и Selena периодически собирает статистику на основе интервала проверки и интервала сбора, которые вы указали. Вы можете указать следующие элементы конфигурации FE для управления поведением сбора:

  • statistic_collect_interval_sec

    Интервал для проверки обновлений данных во время автоматического сбора. Единица: секунды. По умолчанию: 5 минут.

  • statistic_auto_collect_small_table_rows (версия 3.2 и позже)

    Порог для определения, является ли таблица во внешнем источнике данных (Hive, Iceberg, Hudi) маленькой таблицей во время автоматического сбора. По умолчанию: 10000000.

  • statistic_auto_collect_small_table_interval

    Интервал для сбора статистики маленьких таблиц. Единица: секунды. По умолчанию: 0.

  • statistic_auto_collect_large_table_interval

    Интервал для сбора статистики больших таблиц. Единица: секунды. По умолчанию: 43200 (12 часов).

Потоки автоматического сбора проверяют обновления данных с интервалом, указанным в statistic_collect_interval_sec. Если количество строк в таблице меньше statistic_auto_collect_small_table_rows, он собирает статистику таких таблиц на основе statistic_auto_collect_small_table_interval.

Если количество строк в таблице превышает statistic_auto_collect_small_table_rows, он собирает статистику таких таблиц на основе statistic_auto_collect_large_table_interval. Он обновляет статистику больших таблиц только когда Время последнего обновления таблицы + Интервал сбора > Текущее время. Это предотвращает частые задачи анализа для больших таблиц.

Создание автоматической задачи сбора

Синтаксис:

CREATE ANALYZE TABLE tbl_name (col_name [,col_name])
[PROPERTIES (property [,property])]

Вы можете указать свойство statistic_auto_collect_interval для установки интервала сбора исключительно для автоматической задачи сбора. Элементы конфигурации FE statistic_auto_collect_small_table_interval и statistic_auto_collect_large_table_interval не будут действовать на эту задачу.

Пример:

CREATE ANALYZE TABLE ex_hive_tbl (k1)
PROPERTIES ("statistic_auto_collect_interval" = "5");

Query OK, 0 rows affected (0.01 sec)

Просмотр статуса автоматической задачи сбора

То же, что и ручной сбор.

Просмотр метаданных статистики

То же, что и ручной сбор.

Просмотр автоматических задач сбора

Синтаксис:

SHOW ANALYZE JOB [WHERE predicate]

Пример:

SHOW ANALYZE JOB WHERE `id` = '17204';

Empty set (0.00 sec)

Отмена задачи сбора

То же, что и ручной сбор.

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

DROP STATS tbl_name

Ссылки

  • Для запроса элементов конфигурации FE выполните ADMIN SHOW CONFIG.

  • Для изменения элементов конфигурации FE выполните ADMIN SET CONFIG.