План запроса (или план выполнения запроса ) — это последовательность шагов, используемых для доступа к данным в системе управления реляционной базой данных SQL . Это частный случай концепции реляционной модели планов доступа.
Поскольку SQL является декларативным , обычно существует множество альтернативных способов выполнения данного запроса с сильно различающейся производительностью. Когда запрос отправляется в базу данных, оптимизатор запросов оценивает некоторые из различных, правильных возможных планов выполнения запроса и возвращает то, что он считает лучшим вариантом. Поскольку оптимизаторы запросов несовершенны, пользователям и администраторам баз данных иногда приходится вручную проверять и настраивать планы, созданные оптимизатором, чтобы добиться лучшей производительности.
Данная система управления базами данных может предлагать один или несколько механизмов для возврата плана для данного запроса. Некоторые пакеты содержат инструменты, которые будут генерировать графическое представление плана запроса. Другие инструменты позволяют установить специальный режим для соединения, чтобы заставить СУБД вернуть текстовое описание плана запроса. Другой механизм для извлечения плана запроса включает запрос к виртуальной таблице базы данных после выполнения запроса, который необходимо проверить. Например, в Oracle это можно сделать с помощью оператора EXPLAIN PLAN.
Например, инструмент Microsoft SQL Server Management Studio, который поставляется вместе с Microsoft SQL Server, показывает этот графический план при выполнении этого примера соединения двух таблиц с включенным образцом базы данных :
SELECT * FROM HumanResources . Employee AS e INNER JOIN Person . Contact AS c ON e . ContactID = c . ContactID ORDER BY c . LastName
Пользовательский интерфейс позволяет исследовать различные атрибуты операторов, участвующих в плане запроса, включая тип оператора, количество строк, которые каждый оператор потребляет или производит, а также ожидаемую стоимость работы каждого оператора.
Текстовый план, приведенный для того же запроса на снимке экрана, показан здесь:
StmtText---- |-- Сортировать ( УПОРЯДОЧИТЬ ПО : ( [ c ] . [ Фамилия ] ASC )) |-- Вложенные циклы ( внутреннее соединение , ВНЕШНИЕ ССЫЛКИ : ( [ e ] . [ ContactID ] , [ Expr1004 ] ) С НЕУПОРЯДОЧЕННОЙ ПРЕДВАРИТЕЛЬНОЙ ВЫБОРКОЙ ) |-- Сканирование кластеризованного индекса ( ОБЪЕКТ : ( [ AdventureWorks ] . [ HumanResources ] . [ Employee ] . [ PK_Employee_EmployeeID ] AS [ e ] )) |-- Поиск по кластеризованному индексу ( ОБЪЕКТ : ( [ AdventureWorks ] . [ Person ] . [ Contact ] . [ PK_Contact_ContactID ] AS [ c ] ), ИЩЕТ :( [ c ] . [ ContactID ]=[ AdventureWorks ] . [ HumanResources ] . [ Employee ] . [ ContactID ] как [ e ] . [ ContactID ] ) ЗАКАЗАНО ВПЕРЕД )
Это означает, что механизм запросов выполнит сканирование по индексу первичного ключа в таблице Employee и поиск соответствия по индексу первичного ключа (столбец ContactID) в таблице Contact, чтобы найти соответствующие строки. Результирующие строки с каждой стороны будут показаны оператору соединения вложенных циклов, отсортированы, а затем возвращены в качестве результирующего набора в соединение.
Чтобы настроить запрос, пользователь должен понимать различные операторы, которые может использовать база данных, и какие из них могут быть более эффективными, чем другие, при этом обеспечивая семантически правильные результаты запроса.
Просмотр плана запроса может предоставить возможности для новых индексов или изменений в существующих индексах. Он также может показать, что база данных не использует должным образом существующие индексы (см. оптимизатор запросов ).
Оптимизатор запросов не всегда выбирает наиболее эффективный план запроса для данного запроса. В некоторых базах данных план запроса может быть просмотрен, проблемы найдены, а затем оптимизатор запросов дает подсказки о том, как его улучшить. В других базах данных можно попробовать альтернативы для выражения того же запроса (другие запросы, которые возвращают те же результаты). Некоторые инструменты запросов могут генерировать встроенные подсказки в запросе для использования оптимизатором.
Некоторые базы данных, например Oracle, предоставляют таблицу плана для настройки запроса. Эта таблица плана вернет стоимость и время выполнения запроса. Oracle предлагает два подхода к оптимизации:
RBO постепенно устаревает. Для использования CBO необходимо проанализировать все таблицы, на которые ссылается запрос. Для анализа таблицы администратор базы данных может запустить код из пакета DBMS_STATS.
Другие инструменты для оптимизации запросов включают в себя: