Оператор Распараллеливания (Exchange)

На основе статьи Крейга Фридмана: Оператор параллелизма (он же Exchange) .

Перевод Ирины Наумовой.

Как я уже писал в статье Введение в распараллеливание выполнения запросов итератор параллелизма (или оператор обмена) фактически вводит возможность распараллеливания задачи в процессе выполнения запроса.

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



Итератор обмена на самом деле представляет собой два итератора.

Итератор обмена на самом деле представляет собой два итератора: производитель и потребитель (это отличает его от всех других итераторов).

Мы помещаем производителя в корень поддерева запроса (часто называемого ветвью).

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

Потребитель помещается в «лист» следующего поддерева запроса.

Потребитель получает пакеты от своего производителя, извлекает строки из этих пакетов и возвращает строки родительскому итератору.

Например, Оператор перераспределения потоков , работающий со степенью параллелизма (DOP), равной двум, будет состоять из двух производителей и двух потребителей:

Оператор распараллеливания (Exchange)

Обратите внимание, что хотя поток данных между большинством итераторов основан на принципе «вытягивания» (итераторы вызывают GetRow для своих дочерних элементов, когда они готовы обработать другую строку), поток данных оператора обмена между производителем и потребителем основан на принцип «тяги».

push».

То есть производитель заполняет пакет строками и отправляет его потребителю.

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

потребитель со слишком большим количеством пакетов).



Сколько существует различных типов обмена?

Оператора обмена можно классифицировать тремя различными способами.

Во-первых, мы можем классифицировать оператор обмена по количеству потоков-потребителей и/или производителей:

Тип Количество потоков производителя Количество потребительских потоков
Сбор потоков ДОП 1
Перераспределение потоков ДОП ДОП
Распределить потоки 1 ДОП
Оператор Gather Streams часто называют «началом распараллеливания» итератора обмена: т.е.

те операторы, которые расположены выше него в плане, выполняются последовательно, а те операторы, которые находятся ниже него, выполняются параллельно.

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

Оператор Distribute Streams часто называют «завершением распараллеливания» обмена.

Это противоположно предыдущему утверждению: операторы выше Distribute Streams выполняются параллельно, а операторы ниже — последовательно.

Во-вторых, мы можем классифицировать оператор межпотокового обмена на основе того, как строки пересылаются от производителя к потребителю.

Обращаем ваше внимание на свойство «Тип разбиения» оператора потокового обмена.

Тип секционирования имеет смысл для оператора Repartition Streams или Distribute Streams только тогда, когда оператор Gather Streams имеет только один маршрут для строк: к одному потребительскому потоку.

SQL Server поддерживает следующие типы секционирования:

Тип разделения Описание
Транслировать Отправляет все строки во все потребительские потоки.

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

Хэш Определяет, куда отправить каждую строку, на основе оценки хеш-функции для одного или нескольких столбцов в строке.

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

Он используется только в планах запросов с секционированными таблицами.

В-третьих, мы можем классифицировать обмен на слияние (или сохранение порядка сортировки) и неслияние (или сохранение отсутствия порядка).

Потребителю при обмене слиянием гарантируется, что строки от нескольких производителей будут возвращены в заданном порядке сортировки (строки уже должны находиться в этом порядке сортировки у производителя; обмен слиянием ничего не сортирует).

Обмен слиянием имеет смысл только для потоков сбора или перераспределения потоков; Оператор Distribute Streams имеет только одного производителя, поэтому для него возможен только один поток строк, и для потребителей нечего агрегировать.



План выполнения запроса

SQL Server отображает все вышеперечисленные свойства с точки зрения выполнения запроса (в графическом, текстовом и XML-представлении).

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

к значку оператора:

Оператор распараллеливания (Exchange)

В моей следующей статье о параллелизме я начну изучать некоторые планы параллельных запросов и продемонстрирую несколько способов использования операторов обмена.

Теги: #Microsoft SQL Server #sql-сервер

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.