53.1. Путь запроса #

Ниже мы кратко опишем этапы, которые проходит запрос для получения результата.

53.1.1. Для простых запросов #

В нераспределённой системе запрос обрабатывается локально на узле. Например, в случае локальной или глобальной таблицы, или в случае сегментированной таблицы, если оптимизатору достаточно информации, находящейся локально на узле:

  1. Прикладная программа устанавливает подключение к серверу Postgres Pro Shardman. Эта программа передаёт запрос на сервер и ждёт от него результатов.

  2. На этапе разбора запроса сервер выполняет синтаксическую проверку запроса, переданного прикладной программой, и создаёт дерево запроса.

  3. Система правил принимает дерево запроса, созданное на стадии разбора, и ищет в системных каталогах правила для применения к этому дереву. Обнаружив подходящие правила, она выполняет преобразования, заданные в теле правил.

    Одно из применений системы правил заключается в реализации представлений. Когда выполняется запрос к представлению (т. е. виртуальной таблице), система правил преобразует запрос пользователя в запрос, обращающийся не к представлению, а к базовым таблицам из определения представления.

  4. Планировщик/оптимизатор принимает дерево запроса (возможно, переписанное) и создаёт план запроса, который будет передан исполнителю.

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

  5. Исполнитель рекурсивно проходит по дереву плана и получает строки тем способом, который указан в плане. Он сканирует отношения, обращаясь к системе хранения, выполняет сортировку и соединения, вычисляет условия фильтра и, наконец, возвращает полученные строки.

В следующих разделах мы более подробно рассмотрим каждый из этих этапов, чтобы дать представление о внутренних механизмах и структурах данных Postgres Pro Shardman.

53.1.2. Для более сложных запросов #

Схема более сложных запросов представлена ниже:

53.1.2.1. Общий путь запроса #

Если запрос SQL будет выполняться на нескольких узлах или если узел невозможно определить, сначала запрос будет обрабатываться на координаторе, затем на удалённых узлах, и на последнем этапе результаты будут объединены на координаторе.

Рисунок 53.1. Общая схема пути запроса


53.1.2.2. Путь запроса, отправляемого на один узел #

Если оптимизатор может определить узел (например, если у запрашиваемых данных есть ключ сегментирования), единственным отличием от описанного выше пути будет то, что запросы и подзапросы отправятся на определённый узел:

Рисунок 53.2. Схема пути запроса, отправляемого на один узел


53.1.2.3. Быстрый путь запроса #

При включённом параметре shardman.enable_fast_path (по умолчанию отключено) запросы, для которых можно определить узлы, будут идти по более короткому пути. Это работает, только если запрашиваемые данные расположены в конкретном сегменте. При этом запрос содержит параметр sharding_key = X.

Silk также поддерживает выбор быстрого пути для читающих запросов.

Рисунок 53.3. Схема быстрого пути запроса


Имейте в виду некоторые ограничения:

  • Запуск Postgres Pro Shardman должен происходить только после запуска модуля postgres_fdw, поэтому в параметре shared_preload_libraries Postgres Pro Shardman нужно указать после postgres_fdw.

  • Командой UPDATE нельзя изменять ключ сегментирования.

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

  • Запрещаются следующие операции: блокирующие операции FOR UPDATE и FOR SHARE, общие табличные выражения, команда JOIN для соединения таблиц, команда INSERT INTO ... SELECT, оконные функции, запросы MERGE и все операции с возможным быстрым путём запроса.

  • Функции (кроме агрегатных) не поддерживаются.

  • Если значение параметра конфигурации extra_float_digits меньше ноля, использование быстрого пути невозможно.

53.1.2.4. Путь запроса, выполняемого локально на определённом узле #

Если запрос выполняется только на одном узле, к которому можно подключиться напрямую, путь запроса аналогичен пути в нераспределённых системах:

Рисунок 53.4. Схема пути запроса, выполняемого локально на определённом узле