Yandex Cloud
  • Сервисы
  • Решения
  • Почему Yandex Cloud
  • Сообщество
  • Тарифы
  • Документация
  • Связаться с нами
Подключиться
Language / Region
© 2022 ООО «Яндекс.Облако»
  • Оглавление
  • Начало работы
    • Обзор
    • Создание базы данных
    • Аутентификация
    • Интерфейс командной строки YDB CLI
    • Язык запросов YQL
    • YDB SDK
    • Развертывание одноузлового кластера
      • Обзор
      • Docker
      • Бинарный файл
      • Minikube
    • Полезные ссылки
    • Document API, совместимый с Amazon DynamoDB
      • Настройка инструментов AWS
      • Работа с данными через HTTP-интерфейс
      • Работа с AWS CLI
        • Обзор
        • Создание таблицы
        • Добавление данных в таблицу
        • Чтение данных из таблицы
        • Обновление данных
        • Выборка данных
        • Удаление созданных ресурсов
      • Работа с AWS SDK
        • Обзор
        • Создание таблицы
        • Загрузка данных в таблицу
        • Управление записями в таблице
          • Создание записи
          • Чтение записи
          • Обновление записи
          • Удаление записи
        • Поиск и извлечение данных
        • Удаление таблицы
  • Практические руководства
    • Развертывание веб-приложения
    • Разработка Slack-бота
    • Подключение к YDB из функции Yandex Cloud Functions на Python
    • Подключение к базе данных YDB из функции Yandex Cloud Functions на Node.js
    • Конвертация видео в GIF на Python
    • Разработка навыка Алисы и сайта с авторизацией
  • Концепции
    • Обзор
    • Термины и определения
    • Соединение с БД и аутентификация
    • Модель данных и схема
    • Режимы работы Serverless и Dedicated
    • Транзакции
    • Вторичные индексы
    • Time to Live (TTL)
    • Скан запросы
    • Ограничения базы данных
    • Кластер YDB
      • Обзор
      • Общая схема YDB
      • Дисковая подсистема кластера
    • Квоты и лимиты
  • Пошаговые инструкции
    • Обзор
    • Переименование
    • Использование плана запроса и AST
    • Чтение и запись данных
    • Работа со вторичными индексами
  • Рекомендации
    • Обзор
    • Выбор первичного ключа для максимальной производительности
    • Вторичные индексы
    • Постраничный вывод
    • Загрузка больших объемов данных
    • Использование таймаутов
  • Управление базами данных
    • Обзор
    • Облачная консоль управления
      • Обзор
      • Создание, изменение, удаление баз данных
      • Таблицы и директории
      • Управление доступом
    • Интерфейс командной строки YC CLI
    • Резервное копирование и восстановление
    • Диагностика
      • Обзор
      • Системные таблицы
      • Мониторинг
  • Правила тарификации
    • Обзор
    • Бессерверный режим
      • Правила тарификации для бессерверного режима
      • Стоимость запроса для YQL
      • Стоимость запроса для Document API
      • Стоимость запроса для специальных API
    • Режим с выделенными инстансами
  • HTTP API, совместимый с Amazon DynamoDB
    • Все методы
    • Actions
      • BatchGetItem
      • BatchWriteItem
      • CreateTable
      • DeleteItem
      • DeleteTable
      • DescribeTable
      • DescribeTimeToLive
      • GetItem
      • ListTables
      • PutItem
      • Query
      • Scan
      • TransactGetItems
      • TransactWriteItems
      • UpdateItem
      • UpdateTimeToLive
    • Общие ошибки
  • YQL
    • Обзор
    • Типы данных
      • Обзор
      • Простые
      • Опциональные
      • Контейнеры
      • Специальные
      • Преобразования типов
      • Текстовое представление типов данных
      • JSON
    • Синтаксис
      • Обзор
      • Лексическая структура
      • Выражения
      • ACTION
      • ALTER TABLE
      • CREATE TABLE
      • DECLARE
      • DELETE
      • DISCARD
      • DROP TABLE
      • GROUP BY
      • FLATTEN
      • INSERT
      • INTO RESULT
      • JOIN
      • PRAGMA
      • REPLACE
      • SELECT
      • UPDATE
      • UPSERT
      • VALUES
      • WINDOW
      • Неподдерживаемые конструкции
    • Встроенные функции
      • Обзор
      • Базовые
      • Агрегатные
      • Оконные
      • Для работы со списками
      • Для работы со словарями
      • Для работы со структурами
      • Для работы с типами
      • Для работы с JSON
      • Библиотеки C++
        • Обзор
        • Hyperscan
        • Pcre
        • Pire
        • Re2
        • String
        • Unicode
        • DateTime
        • Url
        • Ip
        • Yson
        • Digest
        • Math
        • Histogram
    • Туториал YQL
      • Обзор
      • Создание таблицы
      • Добавление данных в таблицу
      • Выборка данных из всех колонок
      • Выборка данных из определенных колонок
      • Сортировка и фильтрация
      • Агрегирование данных
      • Дополнительные условия выборки
      • Объединение таблиц с помощью JOIN
      • Вставка и модификация данных с помощью REPLACE
      • Вставка и модификация данных с помощью UPSERT
      • Вставка данных с помощью INSERT
      • Обновление данных с помощью UPDATE
      • Удаление данных
      • Добавление и удаление колонок
      • Удаление таблицы
  • Работа с YDB CLI
    • Обзор
    • Установка
    • Структура команд YDB CLI
    • Сервисные команды
    • Соединение с БД и аутентификация
    • Глобальные параметры
    • Работа со схемой БД
      • Список объектов
      • Информация об объекте
      • Директории
      • Вторичные индексы
      • Переименование таблиц
    • Работа с данными
      • Выполнение запроса к данным
      • План исполнения запроса
      • Потоковое чтение таблицы
      • Скан запросы
    • Загрузка и выгрузка данных
      • Обзор
      • Файловая структура выгрузки
      • Выгрузка в файловую систему
      • Загрузка из файловой системы
      • Соединение и аутентификация с S3
      • Выгрузка в S3
      • Загрузка из S3
      • Импорт данных из файла в существующую таблицу
    • Управление профилями
      • Обзор
      • Создание профиля
      • Использование профиля в запросах
      • Получение информации о профиле
      • Удаление профиля
      • Активированный профиль
    • Информационные сервисы
      • Список эндпоинтов
      • Проверка аутентификации
    • Нагрузочное тестирование
      • Обзор
      • Stock нагрузка
  • Работа с YDB SDK
    • Обзор
    • Установка
    • Аутентификация
    • Тестовое приложение
      • Обзор
      • C++
      • C# (.NET)
      • Go
      • Java
      • Node.js
      • PHP
      • Python
      • Архив
        • Go v1
        • Go v2
    • Обработка ошибок в API
    • Рецепты кода
      • Обзор
      • Аутентификация
        • Обзор
        • С помощью токена
        • Анонимная
        • Файл сервисного аккаунта
        • Сервис метаданных
        • С помощью переменных окружения
        • С помощью логина и пароля
      • Балансировка
        • Обзор
        • Равномерный случайный выбор
        • Предпочитать ближайший дата-центр
        • Предпочитать зону доступности
      • Выполнение повторных запросов
      • Диагностика проблем
        • Обзор
        • Включить логирование
        • Подключить метрики в Prometheus
        • Подключить трассировку в Jaeger
      • Установить размер пула сессий
      • Вставка данных
      • Пакетная вставка данных
  • Управление кластером
    • Обзор
    • Развертывание
      • Обзор
      • Kubernetes
        • Обзор
        • Развертывание в Yandex Managed Service for Kubernetes
        • Развертывание в AWS Elastic Kubernetes Service
        • Эксплуатация
      • VM / Baremetal
      • Конфигурация
    • Обслуживание дисковой подсистемы кластера
      • Обзор
      • Способы предотвращения выхода за модель отказа
      • Балансировка нагрузки на диски
      • Способы освобождения места на физических устройствах
      • Расширение кластера
      • Добавление групп хранения
      • Безопасные рестарт и выключение узлов
      • Включение/выключение SelfHeal
      • Включение/выключение Scrubbing
      • Перевоз VDisk'ов
      • Изменение конфигураций через CMS
      • Изменение конфигурации акторсистемы
    • Встроенный UI
      • Обзор
      • YDB Monitoring
      • Hive web-viewer
      • Обзор соединений
      • Логи
      • Графики
    • Системные таблицы
  • Вопросы и ответы
    • Обзор
    • Общие вопросы
    • Ошибки
    • YQL
    • Serverless
    • Все вопросы на одной странице
  • Публичные материалы
  1. Пошаговые инструкции
  2. Использование плана запроса и AST

Использование плана запроса

Статья создана
Yandex Cloud
  • Получение плана запроса
  • Анализ плана запроса

Когда вы выполняете какой-либо запрос, оптимизатор запросов YDB пытается придумать оптимальный план выполнения этого запроса. Чтобы анализировать и лучше понимать работу своих запросов, вы можете получить и проанализировать план запроса. Получить план запроса можно c помощью YDB CLI.

Дополнительно к плану запроса вы можете получить AST (абстрактное синтаксическое дерево). Раздел AST содержит представление на внутреннем языке miniKQL. Эта информация нужна разработчикам YDB для диагностики запроса.

Получение плана запроса

Примечание

Таблицы episodes, series и seasons из приводимых примеров можно создать самостоятельно.
Создание всех таблиц из приводимых примеров описано в разделе "Туториал YQL - Создание таблицы".
А наполнение их данными — в разделе "Туториал YQL - Добавление данных в таблицу".

Получите план следующего запроса:

SELECT season_id, episode_id, title
FROM episodes
WHERE series_id = 1 AND season_id > 1
ORDER BY season_id, episode_id LIMIT 3
YDB CLI
  1. Если у вас еще нет интерфейса командной строки YDB CLI, установите его и подготовьте к работе.

  2. Для получения плана запроса используйте команду explain. Посмотрите как использовать команду, выполнив:

    ydb table query explain --help
    
  3. Выполните команду:

    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"
    

    Результат выполнения:

    Query plan:
    {
        meta : {
            version : "0.1",
            type : query
        },
        tables : [
            {
                name : "/ru-central1/b1gia87mbaomkfvscrus/etn008v5oqsj8joktlvd/episodes",
                reads : [
                    {
                        type : Lookup,
                        lookup_by : [
                            "series_id (\"1\")"
                        ],
                        scan_by : [
                            "season_id (\"1\", +inf]",
                            episode_id
                        ],
                        columns : [
                            episode_id,
                            season_id,
                            title
                        ]
                    }
                ]
            }
        ]
    }
    
  4. Для получения 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 запроса:

    Query AST:
    (
    (let $1 '('"/ru-central1/b1gia87mbaomkfvscrus/etn008v5oqsj8joktlvd/episodes" '"1" '"72075186234215788:16"))
    (let $2 (Uint64 '"1"))
    (let $3 '('"series_id" $2 $2))
    (let $4 '('"season_id" $2 (Void)))
    (let $5 '('"episode_id" (Void) (Void)))
    (let $6 '('"ExcFrom" '"IncTo" $3 $4 $5))
    (let $7 '('"episode_id" '"season_id" '"title"))
    (let $8 (KiSelectRange '"db" $1 $6 $7 '('('"SkipNullKeys" '('"series_id" '"season_id")))))
    (let $9 (Bool 'true))
    (let $10 '($9 $9))
    (let $11 (lambda '($15) '((Member $15 '"season_id") (Member $15 '"episode_id"))))
    (let $12 (KiPartialSort $8 $10 $11))
    (let $13 (Uint64 '"3"))
    (let $14 (Sort (KiPartialTake $12 $13) $10 $11))
    (return '('((Take $14 $13)) (List (ListType (VoidType)))))
    )
    

Анализ плана запроса

Основная секция плана запроса, tables, содержит информацию об обращениях к таблицам. Чтения описаны в разделе reads, а записи — в разделе writes. Ключевой характеристикой любого обращения к таблице является его тип.

Типы чтения:

  • FullScan. Полное сканирование таблицы. Читаются все записи на всех шардах.
  • Scan. Читается определенный диапазон записей.
  • Lookup. Чтение по ключу или префиксу ключа.
  • MultiLookup. Множественные чтения по ключу или префиксу ключа. Данный тип обращения возможен, например, в JOIN'ах.

Типы записи:

  • Upsert. Добавление одной записи.
  • MultiUpsert. Добавление нескольких записей.
  • Erase. Единичное удаление по ключу.
  • MultiErase. Множественные удаления.

Рассмотрим план запроса из примера выше.
Параметр lookup_by показывает, по каким колонкам (ключу или префиксу ключа) выполняется чтение.
Параметр scan_by показывает, по каким колонкам выполняется scan, то есть чтение всех записей в определенном диапазоне значений.
В columns перечислены колонки, значения которых будут вычитываться из таблицы.
Раздел Query AST содержит представление на внутреннем языке miniKQL. Эта информация нужна разработчикам YDB для диагностики запроса.

Еще один пример

Допустим, необходимо получить только первые сезоны всех сериалов. Тогда запрос будет выглядеть так:

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"

План запроса:

Query plan:
{
    meta : {
        version : "0.1",
        type : query
    },
    tables : [
        {
            name : "/ru-central1/b1g4ej5ju4rf5kelpk4b/etn01lrprvnlnhv8v5kj/seasons",
            reads : [
                {
                    type : FullScan,
                    scan_by : [
                        series_id,
                        season_id
                    ],
                    columns : [
                        season_id,
                        series_id,
                        title
                    ]
                }
            ]
        },
        {
            name : "/ru-central1/b1g4ej5ju4rf5kelpk4b/etn01lrprvnlnhv8v5kj/series",
            reads : [
                {
                    type : MultiLookup,
                    lookup_by : [
                        "series_id (expr)"
                    ],
                    columns : [
                        series_id,
                        title
                    ]
                }
            ]
        }
    ]
}

Из данного плана запроса следует, что для таблицы seasons будет выполнен FullScan, а для таблицы series — множественные чтения (тип обращения MultiLookup) по ключу series_id (lookup_by). А тип чтения MultiLookup и раздел lookup_by говорят о том, что для таблицы series будут выполнены множественные чтения по ключу series_id.

Была ли статья полезна?

Language / Region
© 2022 ООО «Яндекс.Облако»
В этой статье:
  • Получение плана запроса
  • Анализ плана запроса