Достаточно хорошо задокументировано, что скалярные UDF создают общий последовательный план.
Учитывая большое количество строк, приходящих в точку в конвейере, где нужно вычислить UDF, почему движок не может просто распределить их между процессорами? Если в UDF нет состояния, порядок не должен иметь значения.
Есть заявления о том, что UDF является черным ящиком, в котором должен использоваться курсор. Я вижу, что пользовательский курсор нельзя распараллелить в SP для случаев, когда между итерациями поддерживается какое-то состояние, но кажется, что в противном случае оно должно быть распараллелено.
Дополнительные баллы за объяснение того, почему двигатель заставляет весь план быть последовательным, а не только этап расчета UDF.
Является ли поддержка параллельной UDF разумной функцией для запроса?
источник
Ответы:
Я не уверен, что все это хорошо задокументировано.
См. Форсирование плана параллельного выполнения и / или презентацию Крейга Фридмана о параллельном выполнении .
Эти претензии не верны.
Насколько я понимаю, текущие ограничения являются чисто результатом некоторых деталей реализации. Нет фундаментальной причины, по которой функции не могут быть выполнены с использованием параллелизма.
В частности, скалярные функции T-SQL выполняются в отдельном контексте T-SQL, что значительно усложняет правильную работу, координацию и завершение работы (особенно в случае ошибки).
Точно так же переменные таблицы поддерживают параллельное чтение (но не запись) в целом, но табличная переменная, предоставляемая табличной функцией, не может поддерживать параллельное чтение по причинам, связанным с реализацией. Я боюсь, что вам нужен кто-то с доступом к исходному коду (и свободой для обмена подробностями), чтобы дать авторитетный ответ.
Конечно, если вы можете сделать достаточно сильный аргумент. Я считаю, что работа будет обширной, поэтому ваше предложение должно соответствовать чрезвычайно высокой планке. Например, связанный (и гораздо более простой) запрос на предоставление встроенных скалярных функций имеет большую поддержку, но уже несколько лет томится невыполненным.
Вы можете прочитать статью Microsoft:
... который описывает подход, который Microsoft использует для решения проблем производительности скалярных функций T-SQL в выпуске после SQL Server 2017.
(акцент мой)
Встроенные скалярные функции T-SQL теперь реализованы в SQL Server 2019 .
источник
Как справедливо упомянул Пол в своем ответе, нет фундаментальной причины, по которой скалярные UDF не могут быть выполнены с использованием параллелизма. Однако, помимо проблем с реализацией, есть еще одна причина, заставляющая их быть последовательными. Froid цитируемой Павел дает больше информации об этом.
Цитата из статьи (раздел 2.3):
Подход Froid, описанный в статье, не только приведет к параллельным планам, но также добавляет гораздо больше преимуществ для запросов с UDF. По сути, он включает ваш запрос на параллельное выполнение UDF.
[Раскрытие: я соавтор статьи Froid]
источник