Обработка запроса в PostgreSQL
Пересказ статьи AGEDB. Query Processing in PostgreSQL
Введение
Как энтузиаст и разработчик ПО я очарован внутренней работой PostgreSQL. Способ, с помощью которого обрабатываются все клиентские запросы в едином серверном процессе, и его сложные подсистемы для обработки запросов действительно изумляют меня. Я захотел выяснить, как работают запросы в PostgreSQL. Я провел некоторое исследование и нашел то, что происходит внутри кода PostgreSQL. Этот краткий обзор объясняет процесс выполнения запроса и то, как PostgreSQL делает это, чтобы гарантировать вам лучшую производительность его выполнения. Конечно, производительность в значительной степени зависит от того, как спроектирована база данных, поэтому обратитесь к советам по основам моделирования базы данных от AGEDB.
Обзор
PostgreSQL назначает выделенный серверный процесс для обработки запросов от каждого клиентского подключения, повышая его надежность и стабильность. Начиная с выхода версии 9.6, в нем также выполняются несколько фоновых работ для улучшения параллельной обработки запросов, использования мощности современных многоядерных процессоров для улучшения производительности. Система поддерживает широкий набор функций в соответствии со стандартом SQL:2011, что делает подсистему обработки запросов одной из наиболее интеллектуальных в индустрии. Эта подсистема методологически представлена пятью ключевыми областями:
Парсер
Первой подсистемой в серверном процессе PostgreSQL является парсер, который преобразует операторы SQL в виде плоского текста в дерево разбора. Дерево разбора затем может быть обработано другими подсистемами сервера. В качестве примера рассмотрим следующий запрос:
testdb=# SELECT id, data FROM tbl_a WHERE id < 300 ORDER BY data;
Дерево разбора для этого запроса будет выглядеть так:

На выходе парсер генерирует дерево разбора, которое организует элементы этого запроса (например, предложения SELECT, FROM, WHERE, ORDER BY) в иерархическую структуру, которую база данных может эффективно анализировать и выполнять.
Важно отметить, что парсер строго проверяет корректность синтаксиса. Он не вникает в смысл операторов SQL; за это отвечает следующий шаг в процессе, обработка анализатором.
Анализатор
Анализатор отвечает за проведение семантического анализа дерева разбора, которое генерируется парсером. На выходе этого процесса появляется дерево запроса. Корнем этого дерева запроса является структура Query, определяемая в parsenodes.h, который содержит метаданные соответствующего запроса, такие как тип команды (SELECT, INSERT или другая). Каждый лист дерева запроса формирует лист или дерево и содержит данные, относящиеся к конкретному предложению запроса.

Простой пример дерева запроса
Дерево запроса, сгенерированное анализатором в PostgreSQL содержит несколько элементов. targetList содержит столбцы, которые будут включены в результат запроса. В том случае, когда входное дерево запроса содержит звездочку, означающую все столбцы, анализатор заменяет ее полным списком столбцов.
Таблица range содержит информацию об отношениях, используемых в запросах, таких как OID и имя таблицы. Дерево соединений (jointree) хранит информацию о предложениях FROM и WHERE, а предложение SORT является списком SortGroupClause.
В целом дерево запроса предоставляет метаданные о выполняемом запросе, включая его тип и конкретные предложения, которые используются следующими подсистемами серверного процесса для планирования и выполнения запроса.
Рерайтер
Рерайтер в PostgreSQL отвечает за применение системы правил и модификации дерева запроса на основе правил, хранящихся в системном каталоге pg_rules. Этот процесс выполняется, если он необходим для оптимизации запроса или для обеспечения соблюдения ограничений целостности данных. Простой пример этапа рерайтинга:

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

Простое дерево плана и связь между деревом плана и результатом
Заключение
Изучение подсистем PostgreSQL дает ясное понимание его конвейера обработки запроса, что важно для каждого, кто связан с обслуживанием баз данных или разработкой приложений. Архитектура системы, разделенная на отдельные фазы, как то парсинг, анализ, рерайтинг, планирование и выполнение, обеспечивает эффективную обработку запроса и надежную производительность.
Исследование каждой подсистемы, проведенное в этой статье, показывает сложность структуры PostgreSQL, которая обеспечивает развитое управление данными и возможности оптимизации. Для разработчиков и администраторов базы данных углубленное знакомство с этими процессами важно для оптимизации производительности приложений и достижения эффективности операций с данными.
Ссылки по теме
1. Понимание планов в PostgreSQL
2. Параллелизм базы данных в PostgreSQL
3. Введение в управление параллелизмом в PostgreSQL
4. Анатомия плана запроса в PostgreSQL
5. Правила в PostgreSQL
Trackbacks
The author does not allow comments to this entry
Comments
Display comments as Linear | Threaded