×
Мы обрабатываем cookies, чтобы сделать наш сайт удобнее и персонализированнее для вас. Подробнее: политика использования «cookies» и «политики конфиденциальности».

Для самостоятельной настройки ознакомьтесь с инструкцией

Дополнительные настройки cookies в браузерах

Файлы cookie автоматически загружаются в ваш браузер при посещении веб-сайта. У вас есть возможность управлять этими файлами. Если Вы не согласны с использованием файлов cookies, запретите их сохранение на своём устройстве, удалите уже имеющиеся файлы cookies через настройки браузера или прекратите использование сайта.

При отключении обработки cookie наш сайт продолжит функционировать, однако будут использоваться исключительно необходимые технические файлы, без которых работа ресурса невозможна.

Инструкция по отключению cookies
Принять
Настроить
Отклонить

ДОКУМЕНТАЦИЯ

Выберите версию, форк и язык для СУБД Digital Q.DataBase, чтобы прочитать или скачать всю документацию.
Техподдержка
Документация
Диасофт
Авторские права © 2016–2025 ООО "Диасофт Экосистема"
Скачать всю документацию:

2.12.3. Параллельные планы

2.12.3.1. Параллельное сканирование
2.12.3.2. Параллельные соединения
2.12.3.3. Параллельная агрегация
2.12.3.4. Параллельный узел Append
2.12.3.5. Рекомендации по использованию параллельных планов

Поскольку каждый рабочий процесс выполняет параллельную часть плана до конца, невозможно просто взять обычный план запроса и запустить его с использованием нескольких фоновых рабочих процессов. Каждый рабочий процесс сформировал бы полную копию результирующего набора данных, в результате чего запрос не выполнился бы быстрее обычного и вернул бы некорректные данные. Вместо этого параллельная часть плана запроса должна представлять собой структуру, известную в оптимизаторе запросов как partial plan; то есть он должен быть спроектирован так, чтобы каждый процесс, выполняющий план запроса, формировал только подмножество выходных строк таким образом, чтобы каждая требуемая результирующая строка гарантированно создавалась ровно одним из взаимодействующих процессов. Как правило, это означает, что сканирование ведущей таблицы запроса должно быть сканированием с поддержкой параллелизма (parallel-aware scan).

2.12.3.1. Параллельное сканирование #

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

  • При использовании parallel sequential scanблоки таблицы будут разделены на диапазоны и распределены между взаимодействующими процессами. Каждый фоновый рабочий процесс завершает сканирование назначенного ему диапазона блоков перед запросом следующего диапазона.

  • При использовании parallel bitmap heap scanодин процесс выбирается ведущим процессом. Данный процесс выполняет сканирование одного или нескольких индексов и строит битовую карту, указывающую, какие блоки таблицы необходимо посетить. Затем эти блоки распределяются между взаимодействующими процессами так же, как и при параллельном последовательном сканировании. Другими словами, сканирование кучи выполняется параллельно, в то время как лежащее в основе сканирование индекса — нет.

  • При использовании параллельное сканирование индекса или параллельное сканирование только по индексу, при котором взаимодействующие процессы по очереди считывают данные из индекса. В настоящее время параллельное сканирование индекса поддерживается только для индексов btree. Каждый процесс запрашивает один блок индекса, сканирует его и возвращает все кортежи, на которые ссылается этот блок; другие процессы могут в то же время возвращать кортежи из другого блока индекса. Результаты параллельного сканирования btree возвращаются в отсортированном порядке внутри каждого рабочего процесса.

Другие типы сканирования, такие как сканирование индексов, отличных от btree, могут поддерживать параллельное сканирование в будущем.

2.12.3.2. Параллельные соединения #

Как и в непараллельном плане, ведущая таблица может быть объединена с одной или несколькими другими таблицами с использованием метода вложенного цикла (nested loop), соединения по хешу (hash join) или соединения слиянием (merge join). Внутренняя сторона соединения может представлять собой любой тип непараллельного плана, поддерживаемый планировщиком, при условии, что его запуск безопасен внутри параллельного рабочего процесса. В зависимости от типа соединения, внутренняя сторона также может быть параллельным планом.

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

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

  • При использовании hash join (без префикса «parallel»), внутренняя сторона плана выполняется полностью каждым участвующим процессом для построения идентичных копий хэш-таблицы. Это может быть неэффективно, если хэш-таблица имеет большой размер или план является ресурсоемким. В случае parallel hash join, внутренняя сторона представляет собой узел parallel hash , который распределяет работу по построению общей хэш-таблицы между участвующими процессами.

2.12.3.3. Параллельная агрегация #

Digital Q.DataBase поддерживает параллельную агрегацию, выполняя агрегирование в два этапа. Сначала каждый процесс, участвующий в параллельной части запроса, выполняет шаг агрегации, формируя промежуточный результат для каждой группы, обрабатываемой этим процессом. Это отражается в плане запроса как узел Partial Aggregate узел. Во-вторых, промежуточные результаты передаются ведущему процессу через Gather или Gather Merge. Наконец, ведущий процесс повторно агрегирует результаты, полученные от всех рабочих процессов, для формирования окончательного результата. Это отражается в плане как узел Finalize Aggregate узел.

Поскольку Finalize Aggregate узел выполняется в ведущем процессе, запросы, формирующие относительно большое количество групп по сравнению с количеством входных строк, будут расцениваться планировщиком запросов как менее эффективные. Например, в худшем случае количество групп, обрабатываемых узлом Finalize Aggregate , может достигать количества входных строк, обработанных всеми рабочими процессами на Partial Aggregate этапе. В таких случаях параллельная агрегация явно не обеспечит прироста производительности. Планировщик запросов учитывает это при планировании и с низкой вероятностью выберет параллельную агрегацию в данном сценарии.

Параллельная агрегация поддерживается не во всех ситуациях. Каждая агрегатная функция должна быть безопасен для параллельного выполнения и должен иметь функцию объединения (combine function). Если агрегат имеет состояние перехода типа internal, он должен иметь функции сериализации и десериализации. Подробнее см. CREATE AGGREGATE . Параллельная агрегация не поддерживается, если какой-либо вызов агрегатной функции содержит предложение DISTINCT или ORDER BY , а также не поддерживается для агрегатов упорядоченных наборов или когда запрос использует GROUPING SETS. . Это может быть использовано только в том случае, когда все участвующие в запросе соединения также являются частью параллельной части плана.

2.12.3.4. Параллельный узел Append #

В случаях, когда Digital Q.DataBase необходимо объединить строки из нескольких источников в один результирующий набор, используется Append или MergeAppend узел плана. Обычно это происходит при реализации оператора UNION ALL или при сканировании секционированной таблицы. Такие узлы могут использоваться в параллельных планах так же, как и в любом другом плане. Однако в параллельном плане планировщик может вместо этого использовать Параллельный узел Append узел.

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

Кроме того, в отличие от обычного узла Append , который может иметь только частичные дочерние узлы при использовании в параллельном плане, узел Parallel Append узел может содержать как частичные, так и полные дочерние планы. Полные дочерние планы будут обрабатываться только одним процессом, так как многократное сканирование привело бы к дублированию результатов. Таким образом, планы, включающие объединение нескольких наборов результатов, могут обеспечивать крупноблочный параллелизм даже при отсутствии эффективных частичных планов. В качестве примера рассмотрим запрос к секционированной таблице, который может быть эффективно выполнен только с использованием индекса, не поддерживающего параллельное сканирование. Планировщик может выбрать Parallel Append обычных Index Scan планов; каждое отдельное сканирование индекса должно быть полностью выполнено одним процессом, но при этом различные сканирования могут выполняться одновременно различными процессами.

enable_parallel_append может использоваться для отключения данной функции.

2.12.3.5. Рекомендации по использованию параллельных планов #

Если запрос, для которого ожидается такое поведение, не формирует параллельный план, можно попытаться уменьшить значение parallel_setup_cost или parallel_tuple_cost. Разумеется, такой план может оказаться медленнее, чем последовательный план, выбранный планировщиком, однако так будет не всегда. Если параллельный план не создается даже при очень малых значениях этих параметров (например, после установки обоих значений в ноль), возможно, существует причина, по которой планировщик запросов не может сформировать параллельный план для данного запроса. См. Раздел 2.12.2 так и Раздел 2.12.4 для получения информации о возможных причинах такой ситуации.

При выполнении параллельного плана можно использовать команду EXPLAIN (ANALYZE, VERBOSE) для отображения статистики по каждому рабочему процессу для каждого узла плана. Это может быть полезно для определения того, равномерно ли распределяется нагрузка между всеми узлами плана, и в целом для понимания характеристик производительности выбранного плана.

Наверх
свяжитесь
с нами
контакты
Для прямой связи с нами вы можете использовать контакты ниже, либо оставить заявку через форму обратной связи, и мы обязательно свяжемся с вами

*поля обязательные к заполнению