0

План запроса

Когда вы обращаетесь к БД, оптимизатор запросов YDB пытается составить наилучший, по его мнению, план выполнения запроса.Чтобы оптимизировать свои запросы к БД с точки зрения скорости их выполнения (и/или стоимости, что актуально для бессерверного режима YDB), нужно получить и проанализировать этот план. Вы можете это сделать через консоль управления или с помощью YDB CLI.Давайте разберем план запроса, который мы использовали на прошлом уроке в качестве примера объединения таблиц.

Скопировать код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  

Войдите в редактор SQL вашей БД и вставьте в поле ввода текст запроса. Нажмите на стрелку справа от кнопки Выполнить и в выпадающем меню выберите опцию Explain.

image

В результате внизу отобразится поле, содержащее план запроса.

Скопировать код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 
                    ] 
                } 
            ] 
        } 
    ] 
} 

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

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

Типы записи:

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

Рассмотрим план запроса из нашего примера.Параметр lookup_by показывает, по каким колонкам (ключу или префиксу ключа) выполняется чтение. Параметр scan_by показывает, по каким колонкам выполняется scan, то есть чтение всех записей в определенном диапазоне значений. В columns перечислены колонки, значения которых будут считываться из таблицы.Из плана запроса следует, что для таблицы seasons будет выполнен FullScan, а для таблицы series — множественные чтения (тип обращения MultiLookup) по ключу series_id (lookup_by). Это говорит нам  о том, что данный запрос составлен не лучшим образом. Тип чтения FullScan означает, что для выполнения запроса потребуется полностью прочитать всю таблицу. Если таблица большая, то такой запрос приведет к избыточному росту нагрузки на БД и задержкам, а в режиме serverless — еще и к повышенным расходам.

Облачная платформа

Свежие комментарии

Подписка

Лучшие статьи

internal_server_error <![CDATA[WordPress &rsaquo; Ошибка]]> 500