Команда EXPLAIN
Показывает план выполнения команды.
Синтаксис:
Пример:
Типы EXPLAIN
AST— абстрактное синтаксическое дерево.SYNTAX— текст запроса после оптимизаций на уровне AST.QUERY TREE— дерево запроса после оптимизаций на уровне Query Tree.PLAN— план выполнения запроса.PIPELINE— конвейер выполнения запроса.
EXPLAIN AST
Выводит AST запроса. Поддерживаются все типы запросов, а не только SELECT.
Настройки:
graph– выводит AST в виде графа, описанного на языке описания графов DOT. По умолчанию — 0.
Примеры:
EXPLAIN SYNTAX
Показывает абстрактное синтаксическое дерево (AST) запроса после синтаксического анализа.
Для этого выполняется парсинг запроса, построение AST запроса и дерева запроса, при необходимости — запуск анализатора запроса и проходов оптимизации, а затем преобразование дерева запроса обратно в AST запроса.
Настройки:
oneline– Выводить запрос в одну строку. По умолчанию:0.run_query_tree_passes– Выполнять проходы по дереву запроса перед выводом дерева запроса. По умолчанию:0.query_tree_passes– Если заданrun_query_tree_passes, определяет, сколько проходов выполнять. Без указанияquery_tree_passesвыполняются все проходы.
Примеры:
Вывод:
При использовании run_query_tree_passes:
Результат:
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 (строка MinMax, Partition, 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 дерево плана отображается с помощью символов псевдографики вместо отступов:
EXPLAIN PIPELINE
Настройки:
header— Выводит заголовок для каждого выходного порта. По умолчанию: 0.graph— Выводит граф, описанный на языке описания графов DOT. По умолчанию: 0.compact— Выводит граф в компактном режиме, если настройкаgraphвключена. По умолчанию: 1.
Когда compact=0 и graph=1, имена процессоров будут содержать дополнительный суффикс с уникальным идентификатором процессора.
Пример:
EXPLAIN ESTIMATE
Показывает приблизительное количество строк, меток и частей, которые нужно прочитать из таблиц при обработке запроса. Работает с таблицами семейства MergeTree.
Пример
Создание таблицы:
Запрос:
Результат:
EXPLAIN TABLE OVERRIDE
Показывает результат применения переопределения таблицы к схеме таблицы, доступной через табличную функцию. Также выполняет проверку и генерирует исключение, если переопределение привело бы к какой-либо ошибке.
Пример
Предположим, у вас есть удалённая таблица MySQL следующего вида:
Результат:
Проверка неполная, поэтому успешный запрос не гарантирует, что переопределение не вызовет проблем.