Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Язык SQL.doc
Скачиваний:
27
Добавлен:
13.08.2013
Размер:
123.39 Кб
Скачать

Структура плана запроса

Оптимизатор определяет множество физических операций, необходимых для выполнения SQL команды, полученное множество операций и порядок их следования называется планом запроса (query plan).

Аналогия с задачей программирования делает роль плана запроса проще для понимания. Программист кодирует инструкции на языке высокого уровня, которые затем компилируются для получения выполняемого программного кода.

Аналогично, программист кодирует утверждения SQL, которые затем обрабатываются оптимизатором для производства выполняемой формы этого кода. Эта выполняемая форма кода есть план запроса.

Дерево запроса

Одним из способов представления запроса, которое обеспечивает понимание механизма его выполнения, является дерево запроса (query tree). Дерево запроса представляет собой древовидную структуру:

  • окончательный результат запроса находится на вершине дерева (в его корне)

  • таблицы БД, участвующие в запросе, являются листьями этого дерева

  • промежуточные узлы дерева представляют физические операции, которые должны выполняться во время запроса.

Следующий пример показывает дерево запроса для утверждения SQL, которое получает имена авторов книг, опубликованных в 1993 году:

SELECT A.NAME

FROM AUTHORS A, BOOCKS B

WHERE (B.DATE_PUBLISHED ='1993') AND (A.NAME = B.NAME);

  Дерево запроса

(в рисунке ошибка, надо поменять местами Соединение и Выборка)

Пример построения дерева запроса

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

SELECT A.NAME

FROM AUTHORS A, BOOCKS B

WHERE (B.DATE_PUBLISHED ='1993') AND (A.NAME = B.NAME);

2.2 Оптимизация, основанная на правилах

Когда был достигнут некоторый прогресс в улучшении обработки запросов, были предприняты усилия для улучшения методов доступа к таблицам. Это касается разработки методов доступа на основе использования индексов. Однако использование техники индексирования увеличивает сложность обработки запроса. Например, если таблица имеет индексы по трем различным колонкам, то любой из них может быть использован для доступа к таблице (помимо последовательного доступа к таблице в физическом порядке расположения строк).

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

  • соединение с помощью вложенного цикла (Nested Loop Join). В этом алгоритме строка читается из первой таблицы, называемой внешней (outer) таблицей, и затем читается каждая строка второй таблицы, называемой внутренней (inner), как кандидат для соединения. Затем читается вторая строка первой таблицы и снова каждая строка из второй, и так до тех пор, пока все строки первой таблицы не будут прочитаны. Если в первой таблице находится M строк, во второй - N, то читается M x N строк;

  • соединение посредством объединения (Merge Join). Этот метод выполнения соединения предполагает, что обе таблицы отсортированы таким образом, что строки читаются в порядке значений колонки (колонок), по которым они соединяются. Это позволяет выполнять соединение посредством чтения строк из каждой таблицы и сравнивания значений колонок соединения до тех пор, пока соответствие этих значений имеет место. В этом способе соединение завершается за один проход по каждой таблице.

Операции соединения подчиняются как коммутативному, так и ассоциативному закону. Следовательно, теоретически возможно выполнять соединение в любом порядке. Например, все следующие предложения являются эквивалентными:

(A JOIN B) JOIN C

A JOIN (B JOIN C)

(A JOIN C) JOIN B

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

Установление эвристических правил для выбора между порядком доступа,порядком и методами соединений называется оптимизацией, основанной на правилах (rule-based optimization). В этом подходе предпочтения назначаются альтернативным решениям, которые являются общепризнанными. Используя эти предпочтения, оптимизатор запросов производит возможные планы выполнения до тех пор, пока не будет достигнут лучший план выполнения, удовлетворяющий этим правилам.

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

  • число строк в таблице;

  • интервал и распределение значений данной колонки;

  • длину строки и, соответственно, число строк на физической странице диска;

  • прочее.

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