Типы EXPLAIN
AST— Абстрактное синтаксическое дерево.SYNTAX— Текст запроса после оптимизаций на уровне AST.QUERY TREE— Дерево запроса после оптимизаций на уровне Query Tree.PLAN— План выполнения запроса.PIPELINE— Конвейер выполнения запроса.
EXPLAIN AST
SELECT.
Настройки:
graph– Выводит AST в виде графа, описанного на языке описания графов DOT. По умолчанию: 0.
EXPLAIN SYNTAX
oneline– Выводить запрос в одну строку. По умолчанию:0.run_query_tree_passes– Выполнять проходы по дереву запроса перед выводом дерева запроса. По умолчанию:0.query_tree_passes– Если заданоrun_query_tree_passes, указывает, сколько проходов выполнить. Еслиquery_tree_passesне указано, выполняются все проходы.
Query
Response
run_query_tree_passes:
Query
Response
EXPLAIN QUERY TREE
run_passes— Выполнить все проходы по дереву запроса перед его выводом. По умолчанию:1.dump_passes— Вывести информацию об использованных проходах по дереву запроса перед выводом дерева запроса. По умолчанию:0.passes— Указывает, сколько проходов по дереву запроса выполнить. Если задано значение-1, выполняются все проходы по дереву запроса. По умолчанию:-1.dump_tree— Показать дерево запроса. По умолчанию:1.dump_ast— Показать AST запроса, сгенерированное из дерева запроса. По умолчанию:0.
EXPLAIN PLAN
optimize— Управляет тем, применять ли оптимизации плана запроса перед его отображением. Значение по умолчанию: 1.header— Выводит заголовок для шага. Значение по умолчанию: 0.description— Выводит описание шага. Значение по умолчанию: 1.indexes— Показывает используемые индексы, количество отфильтрованных частей и количество отфильтрованных гранул для каждого применённого индекса. Значение по умолчанию: 0. Поддерживается для таблиц MergeTree. Начиная с ClickHouse >= v25.9, этот оператор показывает осмысленный результат только при использовании сSETTINGS use_query_condition_cache = 0, use_skip_indexes_on_data_read = 0.projections— Показывает все проанализированные проекции и их влияние на фильтрацию на уровне частей на основе условий по первичному ключу проекции. Для каждой проекции в этом разделе приводится статистика, включая количество частей, строк, меток и диапазонов, оценённых с использованием первичного ключа проекции. Также показывается, сколько частей данных было пропущено благодаря этой фильтрации без чтения из самой проекции. Была ли проекция действительно использована для чтения или только проанализирована для фильтрации, можно определить по полюdescription. Значение по умолчанию: 0. Поддерживается для таблиц MergeTree.actions— Выводит подробную информацию о действиях шага. Значение по умолчанию: 0.sorting— Выводит описание сортировки для каждого шага плана, который формирует отсортированный вывод. Значение по умолчанию: 0.keep_logical_steps— Сохраняет логические шаги плана для JOIN вместо преобразования их в физические реализации JOIN. Значение по умолчанию: 0.json— Выводит шаги плана запроса как строку в формате JSON. Значение по умолчанию: 0. Чтобы избежать лишнего экранирования, рекомендуется использовать формат TabSeparatedRaw (TSVRaw).input_headers— Выводит входные заголовки для шага. Значение по умолчанию: 0. В основном полезно только разработчикам для отладки проблем, связанных с несоответствием входных и выходных заголовков.column_structure— Также выводит структуру столбцов в заголовках помимо их имени и типа. Значение по умолчанию: 0. В основном полезно только разработчикам для отладки проблем, связанных с несоответствием входных и выходных заголовков.distributed— Показывает планы запроса, выполняемые на удалённых узлах для distributed таблиц или параллельных реплик. Значение по умолчанию: 0.compact— Если включено, скрывает из плана шаги выражений и подробную информацию о действиях (входы, функции, псевдонимы и позиции вывода). Действует только приactions = 1. Значение по умолчанию: 0.pretty— Выводит дерево плана с использованием символов построения линий (├──, └──, │) вместо отступов для наглядного отображения иерархии. Также форматирует свойства шага JOIN в одну строку. Значение по умолчанию: 0.
json=1, имена шагов будут содержать дополнительный суффикс с уникальным идентификатором шага.
Пример:
Оценка стоимости шагов и запроса не поддерживается.
json = 1, план запроса представляется в формате JSON. Каждый узел — это словарь, который всегда содержит ключи Node Type и Plans. Node Type — это строка с именем шага. Plans — это массив с описаниями дочерних шагов. В зависимости от типа узла и настроек также могут добавляться другие необязательные ключи.
Пример:
description = 1 к шагу добавляется ключ Description:
header = 1 в шаг добавляется ключ Header в виде массива столбцов.
Пример:
indexes = 1 добавляется ключ Indexes. Он содержит массив использованных индексов. Каждый индекс описывается в формате JSON с ключом Type (строка Partition Min-Max, Partition, Statistics, PrimaryKey или Skip) и следующими необязательными ключами:
Name— имя индекса (в настоящее время используется только для индексовSkip).Keys— массив столбцов, используемых индексом.Condition— используемое условие.Description— описание индекса (в настоящее время используется только для индексовSkip).Parts— количество частей после/до применения индекса.Granules— количество гранул после/до применения индекса.Ranges— количество диапазонов гранул после применения индекса.
projections = 1 добавляется ключ Projections. Он содержит массив проанализированных проекций. Каждая проекция описывается в формате JSON со следующими ключами:
Name— Имя проекции.Condition— Используемое условие по первичному ключу проекции.Description— Описание использования проекции (например, фильтрация на уровне частей).Selected Parts— Количество частей, выбранных проекцией.Selected Marks— Количество выбранных меток.Selected Ranges— Количество выбранных диапазонов.Selected Rows— Количество выбранных строк.Filtered Parts— Количество частей, пропущенных из-за фильтрации на уровне частей.
actions = 1 добавляемые ключи зависят от типа шага.
Пример:
compact = 1 каждый шаг Expression удаляется. Кроме того, если задано actions = 1, строки Actions и Positions скрываются, оставляя только описания шагов:
distributed = 1 вывод включает не только локальный план запроса, но и планы запросов, которые будут выполняться на удалённых узлах. Это полезно для анализа и отладки распределённых запросов.
Пример с distributed таблицей:
pretty = 1 дерево плана отображается с использованием символов псевдографики вместо отступов, а для ключевых шагов показывается дополнительная информация:
- Выходные столбцы запроса выводятся в верхней части плана.
- Выражения в фильтрах, ключах агрегации, описаниях сортировки и оконных функциях отображаются в понятной SQL-подобной нотации (например,
a + 1 > 5вместоgreater(plus(a, 1), 5)). Для наглядности внутренние префиксы идентификаторов столбцов (например,__table1.) удаляются. - Шаги источника (например,
ReadFromMergeTree) показывают свои выходные столбцы. - Шаги фильтрации показывают условие фильтрации в SQL-нотации. Если присутствуют runtime-фильтры JOIN, они отображаются отдельно.
- Шаги агрегации показывают ключи и агрегатные функции с их аргументами (например,
sum(c),count()). - Множества
INиз литералов Tuple показывают свои значения (для больших множеств — в усечённом виде), множества на основе подзапросов помечаются какsubquery1,subquery2и т. д., а множества из таблиц с движкомSetпоказывают имя таблицы. - Шаги JOIN показывают отношение JOIN в математической нотации, оценочное количество строк в результате, а также то, какие выходные столбцы приходят с левой и с правой стороны. Для обозначения разных типов JOIN используются следующие символы:
Например,
t1 ⟕ t2 означает Left JOIN между таблицами t1 и t2.
Число в скобках после имени таблицы (например, t1[100]) указывает на оценочное количество строк,
если доступна статистика таблицы.
Параметр pretty хорошо работает вместе с compact = 1, который скрывает шаги Expression и подробную информацию о действиях, делая план более удобным для чтения.
EXPLAIN PIPELINE
header— Выводит заголовок для каждого выходного порта. По умолчанию: 0.graph— Выводит граф, описанный на языке описания графов DOT. По умолчанию: 0.compact— Выводит граф в компактном режиме, если включена настройкаgraph. По умолчанию: 1.compact_repeated_processor_chains— Объединяет соседние повторяющиеся цепочки процессоров в текстовом выводе, показывая одну копию цепочки с числом повторений. Это может упростить чтение параллельных конвейеров, когда одна и та же цепочка встречается много раз, например при JOIN. На вывод графа это не влияет. По умолчанию: 0.
compact=0 и graph=1, имена процессоров будут содержать дополнительный суффикс с уникальным идентификатором процессора.
Пример:
EXPLAIN ESTIMATE
Query
Query
Response
EXPLAIN TABLE OVERRIDE
Query
Query
Response
Проверка не является исчерпывающей, поэтому успешный запрос не гарантирует, что переопределение не приведёт к проблемам.