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

EXPLAIN

Описание​

Оператор EXPLAIN отображает план выполнения заданного запроса в Doris. Оптимизатор запросов Doris стремится создать эффективный план, используя статистические данные, характеристики данных и такие возможности, как HASH JOIN, партиционирование и бакетирование. Однако из-за теоретических и практических ограничений план иногда оказывается недостаточно эффективным.

Для повышения производительности необходимо проанализировать текущий план. В этой статье объясняется, как использовать оператор EXPLAIN для оптимизации.

Синтаксис​

{EXPLAIN | DESC} [VERBOSE] <query_block>

Обязательные параметры​

<query_block>

Запрос, для которого требуется получить план выполнения.

Необязательные параметры​

[VERBOSE]

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

Результаты выполнения​

Основные понятия​

Чтобы лучше понимать информацию, отображаемую командой EXPLAIN, рассмотрим несколько основных понятий плана выполнения Doris.

НазваниеПояснение
PLANПлан выполнения. Планировщик преобразует запрос в план выполнения, который затем выполняется движком исполнения.
FRAGMENTФрагмент выполнения. Поскольку Doris является распределённым движком исполнения, полный план выполнения разделяется на несколько фрагментов, каждый из которых выполняется на одном узле. Таблица FRAGMENT представляет полный фрагмент выполнения для одного узла. Несколько FRAGMENTS вместе образуют полный PLAN.
PLAN NODEОператор. Наименьшая единица плана выполнения. FRAGMENT состоит из нескольких операторов. Каждый оператор отвечает за определённую логику выполнения, например агрегацию или соединение.

Структура результата​

Результат выполнения оператора EXPLAIN в Doris представляет собой полный PLAN. Внутри PLAN фрагменты FRAGMENTS расположены в порядке, обратном последовательности выполнения. Внутри каждого FRAGMENT операторы (PLAN NODES) также расположены в порядке, обратном последовательности выполнения.

Ниже приведён пример:

+--------------------------------------------------+
| Explain String(Nereids Planner) |
+--------------------------------------------------+
| PLAN FRAGMENT 0 |
| OUTPUT EXPRS: |
| cnt[#10] |
| cnt[#11] |
| PARTITION: UNPARTITIONED |
| |
| HAS_COLO_PLAN_NODE: false |
| |
| VRESULT SINK |
| MYSQL_PROTOCAL |
| |
| 7:VEXCHANGE |
| offset: 0 |
| distribute expr lists: |
| |
| PLAN FRAGMENT 1 |
| |
| PARTITION: RANDOM |
| |
| HAS_COLO_PLAN_NODE: false |
| |
| STREAM DATA SINK |
| EXCHANGE ID: 07 |
| UNPARTITIONED |
| |
| 6:VHASH JOIN(354) |
| | join op: INNER JOIN(BROADCAST)[] |
| | equal join conjunct: cnt[#7] = cnt[#5] |
| | cardinality=1 |
| | vec output tuple id: 8 |
| | vIntermediate tuple ids: 7 |
| | hash output slot ids: 5 7 |
| | distribute expr lists: |
| | distribute expr lists: |
| | |
| |----4:VEXCHANGE |
| | offset: 0 |
| | distribute expr lists: |
| | |
| 5:VEXCHANGE |
| offset: 0 |
| distribute expr lists: |
| |
| PLAN FRAGMENT 2 |
| ... |
| |
| PLAN FRAGMENT 3 |
| ... |
+--------------------------------------------------+

Операторы связаны со своими дочерними узлами пунктирными линиями. Если у оператора несколько дочерних узлов, они располагаются по вертикали в порядке справа налево. В приведённом выше примере у оператора 6 (VHASH JOIN) левый дочерний узел — оператор 5 (EXCHANGE), а правый — оператор 4 (EXCHANGE).

Описание полей фрагмента​

НазваниеОписание
PARTITIONПоказывает распределение данных текущего фрагмента
HAS_COLO_PLAN_NODEУказывает, содержит ли фрагмент операторы colocate
SinkСпособ вывода данных фрагмента; подробности приведены в таблице ниже

Способы вывода данных через Sink

НазваниеОписание
STREAM DATA SINKВыводит данные в следующий фрагмент. Содержит две строки информации.
Первая строка: последующий EXCHANGE NODE, которому отправляются данные.
Вторая строка: способ распределения данных.
- UNPARTITIONED означает, что каждый последующий экземпляр получает полный набор данных. Обычно это используется при широковещательных соединениях или когда логика должна выполняться в одном экземпляре, например для глобального limit или order by.
- RANDOM означает, что каждый последующий экземпляр получает случайное подмножество данных без повторений.
- HASH_PARTITIONED использует перечисленные слоты в качестве ключей хеширования, чтобы направлять части данных одному и тому же последующему экземпляру. Этот способ часто используется перед партиционированными хеш-соединениями или вторым этапом двухэтапной агрегации.
RESULT SINKОтправляет результирующие данные в FE. Первая строка указывает протокол передачи данных; в настоящее время поддерживаются протоколы MySQL и arrow.
OLAP TABLE SINKЗаписывает данные в таблицу OLAP.
MultiCastDataSinksОператор многоадресной передачи, содержащий несколько STREAM DATA SINK. Каждый STREAM DATA SINK отправляет полный набор данных своему последующему узлу.

Описание информации о кортежах​

В режиме VERBOSE выводится информация о кортежах. Она описывает характеристики SLOT в строке данных, включая тип SLOT, допустимость пустых значений и другие свойства.

Вывод содержит несколько TupleDescriptors, каждый из которых содержит несколько SlotDescriptors. Ниже приведён пример:

Tuples:
TupleDescriptor{id=0, tbl=t1}
SlotDescriptor{id=0, col=c1, colUniqueId=0, type=int, nullable=true, isAutoIncrement=false, subColPath=null}
SlotDescriptor{id=2, col=c3, colUniqueId=2, type=int, nullable=true, isAutoIncrement=false, subColPath=null}

TupleDescriptor​

НазваниеОписание
idИдентификатор дескриптора кортежа
tblТаблица, соответствующая кортежу, или null, если неприменимо

SlotDescriptor​

НазваниеОписание
idИдентификатор дескриптора слота
colСтолбец, соответствующий слоту; если неприменимо, поле остаётся пустым
colUniqueIdУникальный идентификатор соответствующего столбца или -1, если неприменимо
typeТип слота
nullableУказывает, могут ли соответствующие данные принимать значение null
isAutoIncrementУказывает, является ли столбец автоинкрементным
subColPathПуть к вложенному столбцу внутри столбца; в настоящее время применим только к типам variant

Описание операторов​

Список операторов​

НазваниеОписание
AGGREGATEОператор агрегации
ANALYTICОператор оконной функции
ASSERT NUMBER OF ROWSОператор проверки количества строк, выводимых последующими узлами
EXCHANGEОператор приёма данных при обмене
MERGING-EXCHANGEОператор приёма данных при обмене с поддержкой сортировки и ограничения количества строк
HASH JOINОператор хеш-соединения
NESTED LOOP JOINОператор соединения вложенными циклами
PartitionTopNОператор предварительной фильтрации данных внутри партиции
REPEAT_NODEОператор дублирования данных
DataGenScanNodeОператор функции, возвращающей таблицу
EsScanNodeОператор сканирования таблицы ES
HIVE_SCAN_NODEОператор сканирования таблицы Hive
HUDI_SCAN_NODEОператор сканирования таблицы Hudi
ICEBERG_SCAN_NODEОператор сканирования таблицы Iceberg
PAIMON_SCAN_NODEОператор сканирования таблицы Paimon
JdbcScanNodeОператор сканирования таблицы Jdbc
OlapScanNodeОператор сканирования таблицы Olap
SELECTОператор фильтрации
UNIONОператор объединения множеств
EXCEPTОператор разности множеств
INTERSECTОператор пересечения множеств
SORTОператор сортировки
TOP-NОператор сортировки и возврата первых N результатов
TABLE FUNCTION NODEОператор табличной функции (lateral view)

Общие поля​

НазваниеОписание
limitОграничивает количество выводимых строк
offsetКоличество строк, пропускаемых перед выводом
conjunctsФильтрует результаты текущего узла. Выполняется до проекций.
projectionsОперации проекции после текущего оператора. Выполняются после conjuncts.
project output tuple idВыходной кортеж после проекции. Расположение слотов в кортеже данных можно посмотреть в tuple desc.
cardinalityОценочное количество строк, рассчитанное оптимизатором
distribute expr listsИсходный способ распределения данных дочерних узлов текущего узла
ID слота выраженияКонкретный слот, соответствующий ID, можно найти в списке кортежей в режиме verbose. Этот список содержит такие сведения, как тип слота и допустимость пустых значений. Обозначается как [#5] после выражения.

AGGREGATE​

НазваниеОписание
(Фаза агрегации)Фаза агрегации обозначается двумя терминами.
Первый термин может быть update (локальная агрегация) или merge (глобальная агрегация).
Второй термин указывает, сериализованы ли текущие данные (serialize) или для них уже завершены итоговые вычисления (finalize).
STREAMINGЭтот флаг есть только у локальных операторов агрегации при усечении многоэтапной агрегации. Он указывает, что текущий узел агрегации может использовать режим STREAMING, в котором входные данные передаются непосредственно на следующий этап агрегации без фактических вычислений.
outputВывод текущего оператора агрегации. Все локальные функции предварительной агрегации имеют префикс partial.
group byКлюч агрегации

ANALYTIC​

НазваниеОписание
functionsИмя текущей оконной функции
partition byСоответствует предложению partition by внутри предложения over оконной функции. Выражение разбиения на окна.
order byВыражение и порядок сортировки внутри окна
windowГраницы окна

ASSERT NUMBER OF ROWS​

НазваниеОписание
EQКоличество строк на выходе последующих узлов должно соответствовать этому ограничению

HASH JOIN​

НазваниеОписание
join opТип соединения
equal join conjunctУсловие равенства в условии соединения
other join predicatesУсловия соединения, кроме равенства
mark join predicatesУсловия, используемые в mark join
other predicatesПредикаты фильтрации после выполнения соединения
runtime filtersСозданные фильтры времени выполнения
output slot idsСписок слотов итогового вывода
hash output slot idsСписок выходных слотов после выполнения хеш-соединения, но до применения остальных условий соединения
isMarkJoinУказывает, является ли соединение mark join

NESTED LOOP JOIN​

НазваниеОписание
join opТип операции соединения
join conjunctsУсловия соединения
mark join predicatesУсловия, используемые в mark join
predicatesПредикаты фильтрации после соединения
runtime filtersСозданные фильтры времени выполнения
output slot idsСписок слотов итогового вывода
isMarkJoinЯвляется ли соединение mark join

PartitionTopN​

НазваниеОписание
functionsОконные функции, для которых применяется оптимизация фильтрации по группам
has global limitНаличие глобального ограничения количества строк
partition limitОграничение количества строк внутри каждой партиции
partition topn phaseТекущая фаза: TWO_PHASE_GLOBAL_PTOPN для глобальной фазы после перераспределения по ключу партиционирования, TWO_PHASE_LOCAL_PTOPN для локальной фазы до перераспределения по ключу партиционирования

REPEAT_NODE​

НазваниеОписание
repeatКоличество повторений каждой строки и соответствующие ID слотов столбцов агрегации
exprsСписок выражений для выходных данных после повторения

DataGenScanNode​

НазваниеОписание
table value functionИмя табличной функции

EsScanNode​

НазваниеОписание
SORT COLUMNСтолбцы для сортировки результатов
LOCAL_PREDICATESФильтры, выполняемые в Doris
REMOTE_PREDICATESФильтры, выполняемые в ES
ES index/typeИндекс и тип ES для запроса

HIVE_SCAN_NODE​

НазваниеОписание
inputSplitNumКоличество частей сканирования
totalFileSizeОбщий размер сканируемых файлов
scanRangesИнформация о частях сканирования
partitionКоличество сканируемых партиций
backendsСведения о данных, назначенных для сканирования каждому BE
cardinalityОценочное количество строк, рассчитанное оптимизатором
avgRowSizeОценочный средний размер строки, рассчитанный оптимизатором
numNodesКоличество BE, используемых текущим оператором
pushdown aggАгрегации, переданные на уровень сканирования

HUDI_SCAN_NODE​

НазваниеОписание
inputSplitNumКоличество частей сканирования
totalFileSizeОбщий размер сканируемых файлов
scanRangesИнформация о частях сканирования
partitionКоличество сканируемых партиций
backendsСведения о данных, назначенных для сканирования каждому BE
cardinalityОценочное количество строк, рассчитанное оптимизатором
avgRowSizeОценочный средний размер строки, рассчитанный оптимизатором
numNodesКоличество BE, используемых текущим оператором
pushdown aggАгрегации, переданные на уровень сканирования
hudiNativeReadSplitsКоличество частей, читаемых нативным способом

ICEBERG_SCAN_NODE​

НазваниеОписание
inputSplitNumКоличество частей сканирования
totalFileSizeОбщий размер сканируемых файлов
scanRangesИнформация о частях сканирования
partitionКоличество сканируемых партиций
backendsСведения о данных, назначенных для сканирования каждому BE
cardinalityОценочное количество строк, рассчитанное оптимизатором
avgRowSizeОценочный средний размер строки, рассчитанный оптимизатором
numNodesКоличество BE, используемых текущим оператором
pushdown aggАгрегации, переданные на уровень сканирования
icebergPredicatePushdownФильтры, переданные в API iceberg

PAIMON_SCAN_NODE​

НазваниеОписание
inputSplitNumКоличество частей сканирования
totalFileSizeОбщий размер сканируемых файлов
scanRangesИнформация о частях сканирования
partitionКоличество сканируемых партиций
backendsСведения о данных, назначенных для сканирования каждому BE
cardinalityОценочное количество строк, рассчитанное оптимизатором
avgRowSizeОценочный средний размер строки, рассчитанный оптимизатором
numNodesКоличество BE, используемых текущим оператором
pushdown aggАгрегации, переданные на уровень сканирования
paimonNativeReadSplitsКоличество частей, читаемых нативным способом

NESTED LOOP JOIN​

НазваниеОписание
join opТип операции соединения
join conjunctsУсловия соединения
mark join predicatesУсловия, используемые в mark join
predicatesПредикаты фильтрации после соединения
runtime filtersСозданные фильтры времени выполнения
output slot idsСписок слотов итогового вывода
isMarkJoinЯвляется ли соединение mark join

PartitionTopN​

НазваниеОписание
functionsОконные функции, для которых применяется оптимизация фильтрации по группам
has global limitНаличие глобального ограничения количества строк
partition limitОграничение количества строк внутри каждой партиции
partition topn phaseТекущая фаза: TWO_PHASE_GLOBAL_PTOPN для глобальной фазы после перераспределения по ключу партиционирования, TWO_PHASE_LOCAL_PTOPN для локальной фазы до перераспределения по ключу партиционирования

REPEAT_NODE​

НазваниеОписание
repeatКоличество повторений каждой строки и соответствующие ID слотов столбцов агрегации
exprsСписок выражений для выходных данных после повторения

DataGenScanNode​

НазваниеОписание
table value functionИмя табличной функции

EsScanNode​

НазваниеОписание
SORT COLUMNСтолбцы для сортировки результатов
LOCAL_PREDICATESФильтры, выполняемые в Doris
REMOTE_PREDICATESФильтры, выполняемые в ES
ES index/typeИндекс и тип ES для запроса

HIVE_SCAN_NODE​

НазваниеОписание
inputSplitNumКоличество частей сканирования
totalFileSizeОбщий размер сканируемых файлов
scanRangesИнформация о частях сканирования
partitionКоличество сканируемых партиций
backendsСведения о данных, назначенных для сканирования каждому BE
cardinalityОценочное количество строк, рассчитанное оптимизатором
avgRowSizeОценочный средний размер строки, рассчитанный оптимизатором
numNodesКоличество BE, используемых текущим оператором
pushdown aggАгрегации, переданные на уровень сканирования

HUDI_SCAN_NODE​

НазваниеОписание
inputSplitNumКоличество частей сканирования
totalFileSizeОбщий размер сканируемых файлов
scanRangesИнформация о частях сканирования
partitionКоличество сканируемых партиций
backendsСведения о данных, назначенных для сканирования каждому BE
cardinalityОценочное количество строк, рассчитанное оптимизатором
avgRowSizeОценочный средний размер строки, рассчитанный оптимизатором
numNodesКоличество BE, используемых текущим оператором
pushdown aggАгрегации, переданные на уровень сканирования
hudiNativeReadSplitsКоличество частей, читаемых нативным способом

ICEBERG_SCAN_NODE​

НазваниеОписание
inputSplitNumКоличество частей сканирования
totalFileSizeОбщий размер сканируемых файлов
scanRangesИнформация о частях сканирования
partitionКоличество сканируемых партиций
backendsСведения о данных, назначенных для сканирования каждому BE
cardinalityОценочное количество строк, рассчитанное оптимизатором
avgRowSizeОценочный средний размер строки, рассчитанный оптимизатором
numNodesКоличество BE, используемых текущим оператором
pushdown aggАгрегации, переданные на уровень сканирования
icebergPredicatePushdownФильтры, переданные в API iceberg

PAIMON_SCAN_NODE​

НазваниеОписание
inputSplitNumКоличество частей сканирования
totalFileSizeОбщий размер сканируемых файлов
scanRangesИнформация о частях сканирования
partitionКоличество сканируемых партиций
backendsСведения о данных, назначенных для сканирования каждому BE
cardinalityОценочное количество строк, рассчитанное оптимизатором
avgRowSizeОценочный средний размер строки, рассчитанный оптимизатором
numNodesКоличество BE, используемых текущим оператором
pushdown aggАгрегации, переданные на уровень сканирования
paimonNativeReadSplitsКоличество частей, читаемых нативным способом

JdbcScanNode​

НазваниеОписание
TABLEИмя сканируемой таблицы на стороне JDBC
QUERYЗапрос, используемый для сканирования

OlapScanNode​

НазваниеОписание
TABLEСканируемая таблица. В скобках указано имя выбранного синхронного материализованного представления.
SORT INFOПрисутствует, когда запланирована предварительная сортировка SCAN. Указывает на частичную предварительную сортировку и предварительное усечение вывода SCAN.
SORT LIMITПрисутствует, когда запланирована предварительная сортировка SCAN. Указывает длину, до которой выполняется предварительное усечение.
TOPN OPTПрисутствует, когда запланировано применение TOP-N Runtime Filter.
PREAGGREGATIONУказывает, включена ли предварительная агрегация. Применимо к моделям с агрегацией MOR и первичным ключом. ON означает, что данные на уровне хранения удовлетворяют требованиям вышележащего уровня без дополнительной агрегации. OFF означает, что выполняется дополнительная агрегация.
partitionsКоличество сканируемых в данный момент партиций, общее количество партиций и список имён сканируемых партиций.
tabletsКоличество сканируемых таблетов и общее количество таблетов в таблице.
tabletListСписок сканируемых таблетов.
avgRowSizeОценочный размер строки, рассчитанный оптимизатором.
numNodesКоличество BE, назначенных для текущего сканирования.
pushAggOpРезультаты возвращаются путём чтения метаданных zonemap. Поддерживается информация об агрегациях MIN, MAX, COUNT.

UNION​

НазваниеОписание
constant exprsСписок константных выражений, включаемых в вывод.
child exprsВыходные данные дочерних узлов проецируются с помощью этого списка выражений и подаются на вход оператору над множествами.

EXCEPT​

НазваниеОписание
child exprsВыходные данные дочерних узлов проецируются с помощью этого списка выражений и подаются на вход оператору над множествами.

INTERSECT​

НазваниеОписание
child exprsВыходные данные дочерних узлов проецируются с помощью этого списка выражений и подаются на вход оператору над множествами.

SORT​

НазваниеОписание
order byКлюч сортировки и конкретный порядок сортировки.

TABLE FUNCTION NODE​

НазваниеОписание
table functionИмя используемой табличной функции.
lateral view tuple idID кортежа, соответствующего вновь созданным столбцам.
output slot idСписок ID слотов для столбцов, выводимых после отсечения столбцов.

TOP-N​

НазваниеОписание
order byКлюч сортировки и конкретный порядок сортировки.
TOPN OPTПрисутствует при применении оптимизации фильтра времени выполнения TOP-N.
OPT TWO PHASEПрисутствует при применении отложенной материализации TOP-N.