Skip to content

Обработка запроса в PostgreSQL

Пересказ статьи AGEDB. Query Processing in PostgreSQL

Введение


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

Обзор


PostgreSQL назначает выделенный серверный процесс для обработки запросов от каждого клиентского подключения, повышая его надежность и стабильность. Начиная с выхода версии 9.6, в нем также выполняются несколько фоновых работ для улучшения параллельной обработки запросов, использования мощности современных многоядерных процессоров для улучшения производительности. Система поддерживает широкий набор функций в соответствии со стандартом SQL:2011, что делает подсистему обработки запросов одной из наиболее интеллектуальных в индустрии. Эта подсистема методологически представлена пятью ключевыми областями:
  • Парсер. Начальная фаза, когда происходит проверка синтаксиса.

  • Анализатор. На этой стадии проверяется существование всех объектов, на которые ссылается запрос, и что они доступны. Тут также определяются типы данных всех выражений.

  • Рерайтер (Rewriter). Здесь разворачиваются любые представления, на которые ссылается запрос, и применяются подстановки на основе правил.

  • Планировщик. Планировщик оценивает различные стратегии выполнения запроса на основе имеющихся индексов и оценки стоимости различных подходов.

  • Исполнитель (Executor). Наконец, исполнитель приводит в действие выбранный план, фактически извлекая или меняя данные.

  • Парсер


    Первой подсистемой в серверном процессе 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

    No Trackbacks

    Comments

    Display comments as Linear | Threaded

    No comments

    The author does not allow comments to this entry

    Add Comment

    Enclosing asterisks marks text as bold (*word*), underscore are made via _word_.
    Standard emoticons like :-) and ;-) are converted to images.

    To prevent automated Bots from commentspamming, please enter the string you see in the image below in the appropriate input box. Your comment will only be submitted if the strings match. Please ensure that your browser supports and accepts cookies, or your comment cannot be verified correctly.
    CAPTCHA

    Form options

    Submitted comments will be subject to moderation before being displayed.