Определять компоненты обработки запросов
Существует четыре отдельных этапа выполнения запроса. В порядке выполнения этих этапов:
- Разбор
- Преобразование (средство переопределения)
- Планирование
- Выполнение
Средство синтаксического анализа
С помощью средства синтаксического анализа проверяется допустимость синтаксиса в строке запроса. Средство синтаксического анализа состоит из двух основных частей:
- 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 не перезаписывают существующие строки, а вставляется новая строка, а старая строка скрыта. После фиксации транзакции процесс вакуума может удалить скрытую строку.
Planner
Планировщику необходимо принять правила запроса и определить, как его можно выполнить наиболее быстро.
Планировщик создает дерево плана, узлы которого представляют физические операции с данными.
В PostgreSQL используется оптимизатор запросов на основе затрат для поиска оптимального плана запроса. Планировщик оценивает различные планы выполнения и объем необходимых ресурсов, таких как циклы ЦП, операции ввода-вывода и т. д. Затем эта оценка преобразуется в единицы, также называемые стоимостью плана. Выбирается план с наименьшей стоимостью.
Однако при увеличении количества соединений количество возможных планов многократно возрастает. Оценка каждого возможного плана даже для относительно небольших запросов становится невозможной. Для ограничения количества возможных планов используются эвристика и алгоритмы. Результатом является то, что выбранный план может не быть оптимальным планом. Однако это почти оптимальный и выбранный в разумное время.
Стоимость — лучший критерий оценки планировщика. Цель оценки затрат заключается в сравнении различных планов выполнения для одного запроса в тех же условиях. Планировщик использует статистические данные, собранные в таблицах и строках, чтобы рассчитать оценку затрат для запросов. Чтобы оценка была точной, статистика должна регулярно обновляться.
Актуальная статистика
С помощью статистики по таблицам и строкам планировщик оптимизатора запросов рассчитывает точную оценку стоимости.
Команда ANALYZE собирает статистику по таблицам базы данных и хранит результаты в системном каталоге pg_statistic. Необходимо выполнить АНАЛИЗ, если:
- Вы отключили autovacuum (который обычно анализирует таблицы автоматически)
- Вы отключили autovacuum и не выполняли АНАЛИЗ недавно
- Любой из предыдущих инструкций, и существует множество инструкций INSERTS, UPDATES или DELETE.
Оценки затрат зависят от актуальной статистики, и если статистика устарела и неэффективный план можно выбрать. Если параметр не передается в АНАЛИЗ, проверяется каждая таблица в базе данных.
Синтаксис ANALYZE выглядит следующим образом:
ANALYZE [ VERBOSE ] [ ***table*** [ ( ***column*** [, ...] ) ] ]
VERBOSE отображает сообщения о ходе выполнения, показывающие, какая таблица анализируется, а также ряд статистических сведений.
Планируйте ежедневное выполнение VACUUM и ANALYZE в периоды малого потребления. ANALYZE может выполняться одновременно с другими действиями, так как для этой команды требуется только блокировка чтения целевой таблицы.
Исполнитель
На этом этапе происходит рекурсивная обработка плана, созданного планировщиком, чтобы извлечь необходимый набор строк. Каждый раз, когда узел плана вызывается исполнителем, должен доставлять строку или сообщать обратно, чтобы сказать, что он завершен.
Исполнитель оценивает все четыре типа SQL-запросов:
- SELECT
- ВСТАВИТЬ
- UPDATE
- DELETE
Для SELECT исполнитель возвращает каждую строку клиенту в качестве результирующий набор.
Для INSERT каждая возвращенная строка вставляется в указанную таблицу. Эта задача выполняется в специальном узле плана верхнего уровня с именем ModifyTable.
Для UPDATE каждая вычисленная строка включает все обновленные значения столбцов, а также идентификатор целевой строки. Данные отправляются в узел ModifyTable, который создает обновленную строку и помечает старую строку как удаленную.
Для DELETE единственным столбцом, возвращаемым планом, является идентификатор строки. С помощью идентификатора строки узел ModifyTable помечает строку как удаленную.