Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Оптимизация выполнения запросов Ред 2011 28_11.doc
Скачиваний:
7
Добавлен:
26.08.2019
Размер:
757.76 Кб
Скачать

Оптимизация выполнения запросов

Вопросом, который обычно возникает, когда Database Engine (или любая другая система реляционной базы данных) выполняет запрос, является вопрос, как доступ к необходимым данным и обработка этих данных в запросе может быть выполнена с максимальной эффективностью.

Компонент СУБД, ответственный за такую деятельность, называется оптимизатором запросов.

Задачей оптимизатора запросов (или просто оптимизатора) является рассмотрение множества возможных стратегий выполнения поиска требуемых в запросе данных и выбор наиболее эффективной стратегии.

Выбранная стратегия называется планом выполнения запроса.

Оптимизатор принимает свои решения с учетом таких факторов, как: насколько велики по размерам таблиц, вовлеченные в запрос, какие существуют индексы и какие логические операции (and, or, not) используются в предложении where. Обычно такие факторы называются статистическими данными.

Процесс выполнения операторов SQL может быть условно разделен на 5 этапов:

Рис.   Процесс выполнения операторов SQL

  1. На первом этапе выполняется синтаксический анализ оператора SQL. На этом этапе проверяется корректность записи SQL-оператора в соответствии с правилами синтаксиса. Проверяется синтаксис запроса, сам запрос преобразуется в дерево.

  2. На этом этапе проверяется корректность параметров оператора SQL: имен отношений, имен полей данных, привилегий пользователя по работе с указанными объектами. Здесь обнаруживаются семантические ошибки. Выполняется проверка всех объектов базы данных, на которые в запросе приводятся ссылки. Например, проверяется существование всех столбцов, на которые ссылается запрос, и определяются их идентификаторы. После процесса формируется окончательное дерево запроса.

  3. На этом этапе проводится оптимизация запроса. В качестве входных оптимизатор запросов получает скомпилированное дерево запроса, которое было сгенерировано на предыдущем шаге, и рассматривает стратегии доступа, прежде чем принять решение, как следует обрабатывать данный запрос. СУБД проводит разделение целостного запроса на ряд минимальных операций и оптимизирует последовательность их выполнения с точки зрения стоимости выполнения запроса. На этом этапе строится несколько планов выполнения запроса и выбирается из них один — оптимальный для данного состояния БД.

Для поиска наиболее эффективного плана выполнения запроса оптимизатор запросов вначале выполняет анализ запроса, в процессе которого он отыскивает аргументы поиска и операции соединения. Затем оптимизатор выбирает индексы, которые будут использоваться. Далее, если существуют операции соединения, оптимизатор выбирает порядок соединений и выбирает одну из техник обработки соединений.

  1. На четвертом этапе СУБД генерирует двоичную версию оптимального плана запроса, подготовленного на этапе 3. Двоичный план выполнения запроса в СУБД фактически является эквивалентом объектного кода программы. Скомпилированные планы запроса сохраняются в части памяти SQL Server, называемой кэшем плана.

  2. На пятом этапе СУБД реализует (выполняет) разработанный план, тем самым выполняя оператор SQL.

Перечисленные этапы отличаются по числу обращений к БД и по процессорному времени, требуемому для их выполнения.

Синтаксический анализ проводится очень быстро, он не требует обращения к системным каталогам БД.

Семантический анализ уже требует работы с базой метаданных, то есть с системными каталогами БД, поэтому при выполнении этого этапа происходит обращение к системному каталогу и серьезная работа с ним.

Этап, связанный с оптимизаций плана запроса, требует работы не только с системным каталогом, но и со статистической информацией о БД, которая характеризует текущее состояние всех отношений, используемых в запросе, их физическое расположение на страницах и сегментах внешней памяти. Этап оптимизации наиболее трудоемкий и длительный в процессе выполнения запроса.

Однако если не проводить этап оптимизации, то стоимость (время) выполнения неоптимизированного запроса может в несколько раз превысить стоимость оптимизированного запроса. Время, потраченное на оптимизацию запроса, с лихвой компенсирует затраты на выполнение неоптимизированного запроса.

Производительность запроса для ее улучшения может быть проанализирована с помощью просмотра планов выполнения запроса (имеются специальные средства).