Компиляция запросов

Оценить
(0 голоса)

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

•             Синтаксический анализ операторов SQL. При нахождении синтаксических ошибок выдается соответствующее сообщение и происходит прерывание запроса; если ни одной ошибки не обнаружено, запрос транслируется во внутреннюю форму, приемлемую для оптимизатора.

•             Семантическое расширение. Запрос может включать просмотр или "намекать" на ограничение ссылочной целостности, или триггер; в расчет должна быть принята каждая семантическая импликация (логическая операция).

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

•             Генерация кода. Создается внутренняя исполняемая форма запроса.

И. наконец, СУБД должна выполнить сформированный план запроса для получения данных.

Оптимизация запросов

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

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

Рассмотрим следующий запрос:

select distinct phone_no, name from phone_book

Если phone_no является первичным ключом телефонной книги phone_book и формирует уникальный индекс, то ключевое слово distinct является лишним и может быть проигнорировано, исключая один шаг из плана запроса.

Другой простой пример перезаписи запроса основан на следующем запросе с промежуточными выборками:

select cust_id, name, address from customer where cust_id in

(select cust_id from orders where order_id in (select order_id from order_lines where quantity > 200));

Для придания оптимизатору большей гибкости этот запрос может быть перезаписан в приводимую далее форму (хотя перезаписи "подзапрос-для-объединения" не всегда представляемы в SQL):

select distinct c.cust_id, name, address from customer c, orders o, order_lines 1 where c.cust_id = o.cust_id and o.order_id = l.order_id and quantity > 200;

Для повышения производительности также могут быть повторно размещены пре-шкаты (убраны или остановлены). Рассмотрим следующий запрос, основанный на федставлении:

create view credit_alert (zipcode, salesrep_id) as (select zipcode, salesrep_id from customer where balance_owed > credit_limit group by zipcode, salesrep_id);

select * from credit_alert

where zipcode >= 94000 and zipcode < 95000;

Оптимизатор может произвести внутреннюю перезапись этого же представления запроса более эффективно:

create view credit_alert (zipcode, salesrep_id) as (select zipcode, salesrep_id from customer where balance owed > credit limit

and zipcode > 94000 and zipcode < 95000 group by zipcode, salesrep_id); select * from credit_alert;

Теперь group by может быть выполнен после, а не перед тем, как будет выполнен предикат zipcode, сокращая, таким образом, общий объем работы.

Факторы, негативно влияющие на оптимизацию запроса
Методы оптимизации
Доступ к таблице
Порядок объединения таблиц
Методы объединения

Добавить комментарий


Защитный код
Обновить