Получение плана исполнения запроса и AST
Чтобы лучше понимать работу запросов, вы можете получить и проанализировать план запроса. Дополнительно к плану запроса вы можете получить AST (абстрактное синтаксическое дерево). Раздел AST содержит представление на внутреннем языке miniKQL.
Получите плана запроса
Получите план запроса:
ydb table query explain \
-q "SELECT season_id, episode_id, title
FROM episodes
WHERE series_id = 1
AND season_id > 1
ORDER BY season_id, episode_id
LIMIT 3"
Основная секция плана запроса, tables
, содержит информацию об обращениях к таблицам. Чтения описаны в разделе reads
, а записи — в разделе writes
. Ключевой характеристикой любого обращения к таблице является его тип.
Типы чтения:
FullScan
— полное сканирование таблицы. Читаются все записи на всех шардах.Scan
— чтение определенного диапазона записей.Lookup
— чтение по ключу или префиксу ключа.MultiLookup
— множественные чтения по ключу или префиксу ключа. Данный тип обращения возможен, например, в JOIN'ах.
Типы записи:
Upsert
— добавление одной записи.MultiUpsert
— добавление нескольких записей.Erase
— единичное удаление по ключу.MultiErase
— множественное удаление.
Рассмотрим план запроса из примера выше.
Параметр lookup_by
показывает, по каким колонкам (ключу или префиксу ключа) выполняется чтение.
Параметр scan_by
показывает, по каким колонкам выполняется чтение всех записей в определенном диапазоне значений.
В columns
перечислены колонки, значения которых будут вычитываться из таблицы.
Получите AST
Для получения AST добавьте в конце команды флаг --ast
:
ydb -e grpcs://<эндпоинт> -d <база данных> \
table query explain -q "SELECT season_id, episode_id, title \
FROM episodes \
WHERE series_id = 1 AND season_id > 1 \
ORDER BY season_id, episode_id LIMIT 3" --ast
В результате дополнительно отобразится AST запроса.
Пример модификации запроса
Измените запрос так, чтобы получить только первые сезоны всех сериалов:
ydb table query explain \
-q "SELECT sa.title AS season_title, sr.title AS series_title, sr.series_id, sa.season_id
FROM seasons AS sa
INNER JOIN series AS sr ON sa.series_id = sr.series_id
WHERE sa.season_id = 1"
Из данного плана запроса следует, что для таблицы seasons
будет выполнен FullScan
, а для таблицы series
— множественные чтения (тип обращения MultiLookup
) по ключу series_id
(lookup_by). А тип чтения MultiLookup
и раздел lookup_by
говорят о том, что для таблицы series
будут выполнены множественные чтения по ключу series_id
.