Оператор EXPLAIN
Показывает план выполнения оператора.
Синтаксис:
Пример:
Виды EXPLAIN
AST— Абстрактное синтаксическое дерево.SYNTAX— Текст запроса после оптимизаций на уровне AST.QUERY TREE— Дерево запроса после оптимизаций на уровне дерева запроса.PLAN— План выполнения запроса.PIPELINE— Конвейер выполнения запроса.
EXPLAIN AST
Вывод дерева AST запроса. Поддерживает все виды запросов, не только SELECT.
Примеры:
EXPLAIN SYNTAX
Возвращает запрос после синтаксических оптимизаций.
Пример:
EXPLAIN QUERY TREE
Настройки:
run_passes— Запускает все проходы дерева запроса перед выводом дерева запроса. По умолчанию:1.dump_passes— Выводит информацию о использованных проходах перед выводом дерева запроса. По умолчанию:0.passes— Указывает, сколько проходов нужно выполнить. Если установлено значение-1, выполняет все проходы. По умолчанию:-1.
Пример:
EXPLAIN PLAN
Вывод шагов плана запроса.
Настройки:
header— Печатает заголовок вывода для шага. По умолчанию: 0.description— Печатает описание шага. По умолчанию: 1.indexes— Показывает использованные индексы, количество отфильтрованных частей и количество отфильтрованных гранул для каждого примененного индекса. По умолчанию: 0. Поддерживается для таблиц MergeTree.actions— Печатает подробную информацию о действиях шага. По умолчанию: 0.json— Печатает шаги плана запроса в виде строки в формате JSON. По умолчанию: 0. Рекомендуется использовать формат TSVRaw, чтобы избежать ненужного экранирования.
Когда 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— Количество гранул до/после применения индекса.
Пример:
При actions = 1 добавляются ключи, зависящие от типа шага.
Пример:
EXPLAIN PIPELINE
Настройки:
header— Печатает заголовок для каждого выходного порта. По умолчанию: 0.graph— Печатает граф, описанный на языке описания графов DOT. По умолчанию: 0.compact— Печатает граф в компактном режиме, если включена настройкаgraph. По умолчанию: 1.
Когда compact=0 и graph=1, имена процессоров будут содержать дополнительный суффикс с уникальным идентификатором процессора.
Пример:
EXPLAIN ESTIMATE
Показывает оценочное количество строк, меток и частей, которые будут прочитаны из таблиц во время обработки запроса. Работает с таблицами из семейства MergeTree.
Пример
Создание таблицы:
Запрос:
Результат:
EXPLAIN TABLE OVERRIDE
Показывает результат переопределения таблицы в схеме таблицы, доступной через табличную функцию. Также выполняет некоторую проверку, выбрасывая исключение, если переопределение может привести к ошибке.
Пример
Предположим, у вас есть удаленная таблица MySQL, подобная этой:
Результат:
Проверка не является полной, поэтому успешный запрос не гарантирует, что переопределение не вызовет проблем.