Оператор 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, такая как эта:
Результат:
Проверка не завершена, поэтому успешный запрос не гарантирует, что переопределение не вызовет проблем.