Определение компонентов обработки запросов

Завершено

Существует четыре отдельных этапа выполнения запроса. В порядке выполнения этих этапов:

  1. Синтаксический анализ
  2. Преобразование (перезапись)
  3. Планирование
  4. Исполнение

Средство синтаксического анализа

Средство синтаксического анализа отвечает за проверку строки запроса на допустимый синтаксис. Средство синтаксического анализа состоит из двух основных частей:

  • gram.y , состоящий из набора правил грамматики и соответствующих действий.
  • scan.1лексер, который распознает идентификаторы и ключевые слова SQL. Каждое ключевое слово или идентификатор активирует создание маркера, который затем передается анализатору.

Средство синтаксического анализа создает дерево запросов, которое разделяет запрос на идентифицируемые части, чтобы понять, какие таблицы участвуют, какие фильтры были применены и т. д. Части дерева запросов:

  • Тип команды — SELECT, INSERT, UPDATE или DELETE.
  • Запись таблицы диапазона (RTE) — список отношений, таблиц, ie вложенных запросов, результатов соединений и т. д. В инструкции SELECT эти элементы отображаются после ключевого слова FROM.
  • Отношение результатов — отношение результата для команд INSERT, UPDATE и DELETE — это таблица или представление, в котором изменения вступили в силу.
  • Целевой список — результаты запроса, определенные между ключевыми словами SELECT и FROM. Команды DELETE не создают результат, поэтому планировщик добавляет специальную запись, чтобы позволить исполнителю найти строку для удаления. Команды INSERT определяют новые строки, которые должны перейти в отношение результата. Для команд UPDATE целевой список описывает новые строки, которые должны заменить старые.
  • Квалификация — логическое значение, указывающее, должна ли выполняться операция для конечной строки результата. Он соответствует предложению WHERE инструкции SQL.
  • Дерево соединения — это дерево может быть списком элементов FROM. Соединения можно выполнять в любом порядке или выполнять в определенном порядке, например внешние соединения.
  • Другие — элементы, которые не относятся к этому этапу, например предложение ORDER BY.

Рерайтер

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

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

Например, правила в SELECT всегда применяются в качестве последнего шага, включая запросы INSERT, UPDATE и DELETE. Правила также означают, что запросы UPDATE не перезаписывают существующие строки, а вставляется новая строка, а старая строка скрыта. После фиксации транзакции процесс очистки может удалить скрытую строку.

Проектировщик

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

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

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

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

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

Актуальная статистика

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

ANALYZE собирает статистику о таблицах базы данных и сохраняет результаты в системном каталоге pg_statistic . Необходимо выполнить АНАЛИЗ, если:

  • Вы отключили autovacuum (который обычно анализирует таблицы автоматически)
  • Вы отключили autovacuum и не выполняли АНАЛИЗ недавно
  • Любой из предыдущих инструкций, и существует множество инструкций INSERTS, UPDATES или DELETE.

Оценки затрат зависят от актуальной статистики, и если статистика устарела, можно выбрать неэффективный план. Если параметр не передается в АНАЛИЗ, проверяется каждая таблица в базе данных.

Синтаксис для АНАЛИЗА:

ANALYZE [ VERBOSE ] [ ***table*** [ ( ***column*** [, ...] ) ] ]

В VERBOSE отображаются сообщения о ходе анализа таблицы, а также некоторые статистические данные.

Запланируйте выполнение VACUUM и ANALYZE ежедневно во время низкой загруженности. АНАЛИЗ может выполняться параллельно с другими действиями, так как для нее требуется только блокировка чтения в целевой таблице.

Executor

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

Исполнитель оценивает все четыре типа запросов SQL:

  • ВЫБЕРИТЕ
  • ВСТАВИТЬ
  • Обновление
  • Удалить

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

Для INSERT каждая возвращаемая строка вставляется в указанную таблицу. Эта задача выполняется в специальном узле плана верхнего уровня с именем ModifyTable.

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

Для DELETE план возвращает только один столбец — идентификатор строки. Узел ModifyTable использует идентификатор строки, чтобы пометить строку как удаленную.