Задачей оптимизатора является разработка наиболее эффективного плана выполнения для заданного запроса. Эта задача решается с использованием следующих четырех фаз (рис. 20.1).
1. Синтаксический разбор (parsing). Проверяется синтаксис запроса, сам запрос преобразуется в дерево. После этого выполняется проверка всех объектов базы данных, на которые в запросе приводятся ссылки. (Например, проверяется существование всех столбцов, на которые ссылается запрос, и определяются их идентификаторы.) После процесса проверки формируется окончательное дерево запроса.
2. Компиляция запроса (query compilation). Дерево запроса компилируются оптимизатором запросов.
3. Оптимизация запроса (query optimization). В качестве входных данных оптимизатор запросов получает скомпилированное дерево запроса, которое было сгенерировано на предыдущем шаге, и рассматривает различные стратегии доступа, прежде чем принять решение, как следует обрабатывать данный запрос. Для поиска наиболее эффективного плана выполнения запроса оптимизатор запросов вначале выполняет анализ запроса, в процессе которого он отыскивает аргументы поиска и операции соединения. Затем оптимизатор выбирает индексы, которые будут использоваться. Под конец, если существуют операции соединения, оптимизатор выбирает порядок соединений и выбирает одну из техник обработки соединений. (Эти фазы оптимизации детально рассматриваются в следующем разделе.)
4. Выполнение запроса (query execution). После того как будет сгенерирован план выполнения, он сохраняется и запрос выполняется.