Перейти к содержанию

PostgreSQL

Выполнение запроса

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

Разбор

Разбор запроса делится на лексический, синтаксический и семантический анализ.

Лексический анализатор разбирает текст запроса на лексемы (ключевые слова, строковые и числовые литералы). Синтаксический анализатор убеждается, что полученный набор лексем соответствует грамматике языка.
PostgreSQL использует для разбора стандартные инструменты — утилиты Flex и Bison.

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

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

Трансформация

Трансформации используются ядром для нескольких целей. Одна из них — заменять в дереве разбора имя представления на поддерево, соответствующее запросу этого представления. Другой пример использования трансформаций ядром системы — реализация разграничения доступа на уровне строк (row-level security).

Планировка

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

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

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

Выполнение

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

В памяти обслуживающего процесса создается портал — объект, хранящий состояние выполняющегося запроса. Состояние представляется в виде дерева, повторяющего структуру дерева плана.

Фактически узлы дерева работают как конвейер, запрашивая и передавая друг другу строки с данными.

Ссылки

Задачи