53.1. Путь запроса #
Ниже мы кратко опишем этапы, которые проходит запрос для получения результата.
53.1.1. Для простых запросов #
В нераспределённой системе запрос обрабатывается локально на узле. Например, в случае локальной или глобальной таблицы, или в случае сегментированной таблицы, если оптимизатору достаточно информации, находящейся локально на узле:
Прикладная программа устанавливает подключение к серверу Postgres Pro Shardman. Эта программа передаёт запрос на сервер и ждёт от него результатов.
На этапе разбора запроса сервер выполняет синтаксическую проверку запроса, переданного прикладной программой, и создаёт дерево запроса.
Система правил принимает дерево запроса, созданное на стадии разбора, и ищет в системных каталогах правила для применения к этому дереву. Обнаружив подходящие правила, она выполняет преобразования, заданные в теле правил.
Одно из применений системы правил заключается в реализации представлений. Когда выполняется запрос к представлению (т. е. виртуальной таблице), система правил преобразует запрос пользователя в запрос, обращающийся не к представлению, а к базовым таблицам из определения представления.
Планировщик/оптимизатор принимает дерево запроса (возможно, переписанное) и создаёт план запроса, который будет передан исполнителю.
Он выбирает план, сначала рассматривая все возможные варианты получения одного и того же результата. Например, если для обрабатываемого отношения создан индекс, прочитать отношение можно двумя способами. Во-первых, можно выполнить простое последовательное сканирование, а во-вторых, можно использовать индекс. Затем оценивается стоимость каждого варианта и выбирается самый дешёвый. Затем выбранный вариант разворачивается в полноценный план, который сможет использовать исполнитель.
Исполнитель рекурсивно проходит по дереву плана и получает строки тем способом, который указан в плане. Он сканирует отношения, обращаясь к системе хранения, выполняет сортировку и соединения, вычисляет условия фильтра и, наконец, возвращает полученные строки.
В следующих разделах мы более подробно рассмотрим каждый из этих этапов, чтобы дать представление о внутренних механизмах и структурах данных 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_librariesPostgres Pro Shardman нужно указать после postgres_fdw.Командой
UPDATEнельзя изменять ключ сегментирования.Работает только для сегментированных таблиц, если у каждой таблицы один ключ сегментирования.
Запрещаются следующие операции: блокирующие операции
FOR UPDATEиFOR SHARE, общие табличные выражения, командаJOINдля соединения таблиц, командаINSERT INTO ... SELECT, оконные функции, запросыMERGEи все операции с возможным быстрым путём запроса.Функции (кроме агрегатных) не поддерживаются.
Если значение параметра конфигурации
extra_float_digitsменьше ноля, использование быстрого пути невозможно.
53.1.2.4. Путь запроса, выполняемого локально на определённом узле #
Если запрос выполняется только на одном узле, к которому можно подключиться напрямую, путь запроса аналогичен пути в нераспределённых системах:
Рисунок 53.4. Схема пути запроса, выполняемого локально на определённом узле