Как работает Постгрес? | Кодементор

Перейти к профилю Дивья Нагар

Дивья Нагар

21 сентября 2017 г.

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

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

Так как же Postgres это делает? Давайте возьмем простой пример и разберем его более подробно. Это простой запрос INSERT.

ВСТАВИТЬ В имя_таблицы (столбец_1, столбец_2) ЗНАЧЕНИЯ (значение_1, значение_2)

Итак, вот что происходит, когда вышеуказанный запрос отправляется в Postgres.

  1. Разобрать
  2. Анализировать и переписывать
  3. План
  4. Выполнять

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

Разобрать (pg_parse_query)

Изначально этот запрос попадает в синтаксический анализатор, который преобразует строковый запрос в список дерева синтаксического анализа (Узлы RawStmt). Лексический сканер разбивает запрос на токены. Парсер использует грамматику из грамм.г и токены, сгенерированные сканером, для получения типа запроса. Наконец, он загружает правильную структуру для запроса и генерирует необработанное дерево. Вывод для приведенного выше запроса будет примерно таким.

[{ InsertStmt: { relation: [Object]столбцы: [Array], выберитеStmt: [Object] } } ]

Проанализируй и перепиши (pg_analyze_and_rewrite)

После создания исходного дерева, если мы увидим в exec_simple_query следующую функцию, с которой мы столкнемся, это pg_analyze_and_rewrite. Он выполняет некоторый анализ необработанного дерева и пытается его оптимизировать. Для анализа запроса он применяет некоторые операции преобразования к различным предложениям, присутствующим в нашем запросе. Например, если у нас есть предложение WHERE, оно вызывает TransformWhereClause и проверяет, является ли выходное значение логическим. Он использует различные преобразования для разных предложений, таких как transformLimitClause, transformGroupClauseExpr и т.п.

Запрос INSERT изменяет некоторые столбцы базы данных. На этом этапе Postgres создает целевой список, в котором хранятся столбцы, которые будут изменены при выполнении этого запроса. После анализа и перезаписи наступает очередь оптимизации. Postgres имеет один модуль оптимизатора для оптимизации запросов. Он использует структуру запроса для определения наилучшего порядка соединения таблиц, т. е. в каком порядке должны выполняться операции соединения, чтобы ускорить выполнение.

План (pg_plan_queries)

Этот модуль генерирует дерево плана, возглавляемое Запланированный стмт узел . PlannedStmt содержит информацию, которая необходима исполнительному модулю для выполнения запроса. Дерево плана содержит узлы плана. Узлы плана имеют информацию о своих задачах. Каждый узел можно рассматривать как задачу, которая имеет некоторую стоимость и другие факторы, такие как план_ряды, plan_node_id. Эти факторы необходимы для выполнения этого узла. Каждый узел в дереве плана имеет одну ветвь. Он принимает входные данные от своего дочернего элемента и передает вывод своему родителю. На основе стоимости узлов плана Postgres оценивает общее время выполнения запроса. Чтобы получить больше информации об этом, попробуйте EXPLAIN в Postgres. Как вы можете видеть в выводе, есть несколько задач со своей стоимостью. Это вывод модуля плана, который переходит к модулю выполнения. Это также может помочь вам в профилировании и понимании того, какая часть запроса занимает больше времени, и, следовательно, в его оптимизации.


EXPLAIN в запросе на вставку-выбор

Исполнение

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


Дерево планирования спроса

Это изображение обозначает дерево плана, которое мы создали в разделе плана. Для узла ограничения плана требуется по крайней мере одна строка. Он требует эту строку от узла плана сортировки, который рекурсивно требует строку от Seq Scan. Во время выполнения узел плана сортировки будет повторно вызывать узел плана последовательного сканирования, чтобы отсортировать строки. Когда ввод исчерпан, узел плана сортировки сохранит отсортированные строки, чтобы при необходимости он мог доставить их в узел плана ограничения.

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


EXPLAIN в простом запросе на вставку

Так вот как работает исполнитель Postgres. Для получения более подробной информации о выполнении запросов на обновление и удаление вы можете посмотреть официальное руководство Postgres. Запросы могут усложняться, деревья синтаксического анализа и планирования могут увеличиваться, но процесс остается прежним. Я надеюсь, что этот пост дал вам некоторое представление о рабочем процессе Postgres. Хотя вам могут не понадобиться все эти детали при написании запроса, всегда полезно знать свои инструменты.

Ресурсы:

  1. Следование оператору Select через внутренние компоненты Postgres
  2. Руководства по Postgres

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *