Сбор статистики для CBO
В этой теме описывается базовая концепция оптимизатора на основе стоимости (CBO) Selena и как собирать статистику для CBO для выбора оптимального плана запроса. Selena 2.4 вводит гистограммы для сбора точной статистики распределения данных.
Начиная с версии 3.2.0, Selena поддерживает сбор статистики из таблиц Hive, Iceberg и Hudi, уменьшая зависимость от других систем metastore. Синтаксис аналогичен сбору статистики для внутренних таблиц Selena.
Что такое CBO
CBO критически важен для оптимизации запросов. После того как SQL-запрос поступает в Selena, он парсится в логический план выполнения. CBO переписывает и преобразует логический план в несколько физических планов выполнения. Затем CBO оценивает стоимость выполнения каждого оператора в плане (например, CPU, память, сеть и I/O) и выбирает путь запроса с наименьшей стоимостью в качестве финального физического плана.
Selena CBO был запущен в Selena 1.16.0 и включен по умолчанию начиная с версии 1.19. Разработанный на основе фреймворка Cascades, Selena CBO оценивает стоимость на основе различной статистической информации. Он способен выбрать план выполнения с наименьшей стоимостью среди десятков тысяч планов выполнения, значительно повышая эффективность и производительность сложных запросов.
Статистика важна для 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 использует гистограммы равной высоты, которые построены на нескольких корзинах (buckets). Каждая корзина содержит одинаковое количество данных. Для значений данных, которые часто запрашиваются и оказывают значительное влияние на селективность, Selena выделяет отдельные корзины. Больше корзин означает более точную оценку, но может также вызвать небольшое увеличение использования памяти. Вы можете настроить количеств о корзин и наиболее частых значений (MCVs) для задачи сбора гистограмм.
Гистограммы применимы к столбцам с сильно смещенными данными и частыми запросами. Если данные вашей таблицы равномерно распределены, вам не нужно создавать гистограммы. Гистограммы могут быть созданы только для столбцов числовых типов, DATE, DATETIME или строковых типов.
Гистограммы хранятся в таблице 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