25.6.26

Логика принятия решения о размещении параллельных запросов в SQL Server

Автор: Bob Dorr - MS Principal SQL Server Escalation Engineer, SQL Server Parallel Query Placement Decision Logic

Недавно у меня состоялся разговор с Jonathan Kehayias из sqlskills.com о размещении рабочих потоков, принадлежащих параллельному запросу. Когда я расспрашивал людей и изучал код, я быстро обнаружил, что предположение всё ещё заключается в том, что используется «наименее загруженный узел» (Least Loaded Node), но это изменилось в SQL Server 2012, и осведомлённость об этом как у наших инженеров поддержки, так и у клиентов оставляет желать лучшего. В этой статье я освещаю различные варианты решений, доступные SQL Server 2012, 2014 и 2016.

Существует множество различных вариантов размещения степени параллелизма (Degree of Parallelism, DOP), из которых SQL Server может выбирать. Таблица ниже описывает типы выбора и документирует их поведение.

Варианты размещения DOP

Тип выбора Описание Условия / Примечания
SMP или привязанный к соединению
(SMP or Connection Bound)
Размещает потоки на одном узле. Требуется флаг трассировки -T2479. Либо система имеет только один узел, либо она рассматривается так, как будто узел соединения является единственным узлом в системе. DOP разрешён, если свободных потоков на узле >= (dop * количество ветвей в запросе).
Полный
(Full)
Размещает потоки на всех узлах. Узел 0 всегда будет начальным узлом. Начиная с узла с id = 0, SQL Server перебирает планировщики и узлы, пока не разместит все рабочие потоки. DOP разрешён, если все рабочие потоки могут быть размещены по всей системе.
Наименее загруженный узел
(Least Loaded Node)
Размещает потоки на наименее загруженном узле. Требуется флаг трассировки -T2467. Циклически проходит по онлайн-узлам, определяя, достаточно ли свободных потоков на каком-либо одном узле для поддержки текущего запроса DOP. Убеждается, что в узле достаточно онлайн-планировщиков, чтобы поддержать запрос без накопления запросов на одних и тех же планировщиках.
Использовать следующий узел
(Use Next Node)
Размещает потоки внутри узла. Требуется флаг трассировки -T2468. Находит следующий узел, который может обслужить запрос DOP. В отличие от режима Full, глобальный диспетчер ресурсов отслеживает последний использованный узел. Начиная с последней позиции и переходя к следующему узлу, SQL Server проверяет возможности размещения запроса. Если узел не может поддержать запрос, SQL Server продолжает переходить к следующим узлам и выполнять поиск.
Распределение
(Spread)
Размещает потоки на нескольких узлах. Это наиболее распространённое решение, принимаемое SQL Server. Решение распределяет рабочие потоки по нескольким узлам по мере необходимости. Дизайн похож на Full, за исключением того, что начальная позиция основана на сохранённом глобальном нумераторе следующего узла.
  • SQL Server проверяет наличие онлайн-узлов и пропускает офлайн-узлы.
  • SQL Server учитывает количество онлайн-планировщиков в каждом узле.
  • При назначении рабочих потоков SQL Server избегает назначения рабочих потоков одного запроса на один и тот же планировщик.
  • Логика решения защищена и синхронизируется между запросами с помощью QRY_PARALLEL_THREAD_MUTEX (см. sys.dm_os_wait_status).

Выходные данные, связанные с расчётом DOP

Ниже приведены некоторые из выходных данных, связанных с расчётом DOP:

  • XEvent: XeSqlPkg::calculate_dop
  • SQL Server 2016 DMV: sys.dm_exec_query_parallel_workers
  • XML статистики: информация о времени выполнения (runtime information)


Комментариев нет:

Отправить комментарий