Досить добре зафіксовано, що АДС застосовують загальний серійний план.
Я не впевнений, що це все так добре зафіксовано.
- Скалярна функція T-SQL запобігає паралелізму в будь-якому місці плану.
- Скалярна функція CLR може виконуватися паралельно, доки вона не має доступу до бази даних.
- Функція T-SQL з багатовикладною операцією змушує серійну зону в плані, який може використовувати паралелізм в іншому місці.
- Функція T-SQL з вбудованою таблицею розширюється як перегляд, тому не має прямого ефекту.
Див. Розділ Формування плану паралельного виконання та / або презентацію Паралельного виконання Крейга Фрідмана .
Існують претензії на те, що UDF в чорному полі має використовувати курсор.
Ці твердження невірні.
Додаткові бали для пояснення, чому двигун змушує весь план бути послідовним, а не лише етапом розрахунку UDF.
Я розумію, що нинішні обмеження є результатом певних деталей реалізації. Немає принципової причини, чому функції не можна було б виконувати за допомогою паралелізму.
Зокрема, скалярні функції T-SQL виконуються всередині окремого контексту T-SQL, що значно ускладнює правильну роботу, координацію та відключення (особливо у випадку помилки).
Так само змінні таблиці підтримують паралельне зчитування (але не записує) загалом, але змінна таблиця, оголена функцією, яка оцінюється за таблицею, не здатна підтримувати паралельні читання з конкретних причин реалізації. Мені потрібно, щоб хтось із доступом до вихідного коду (і свободою ділитися деталями) надати авторитетну відповідь, я боюся.
Чи є підтримка паралельного UDF розумною особливістю запитувати?
Звичайно, якщо ви зможете зробити досить міцну справу. Моє власне відчуття полягає в тому, що робота, яка займається, була б великою, тому ваша пропозиція повинна відповідати надзвичайно високій плані. Наприклад, пов’язаний (і набагато простіший) запит надати вбудовані скалярні функції має велику підтримку, але вже багато років не вистачає.
Ви можете прочитати папір Microsoft:
... який описує підхід, який Microsoft сприймає для вирішення питань щодо виконання функцій скалярної функції T-SQL у випуску після SQL Server 2017.
Мета Froid - надати можливість розробникам використовувати абстрагування UDF та процедур без шкоди для продуктивності. Froid досягає цієї мети, використовуючи нову техніку для автоматичного перетворення імперативних програм у еквівалентні реляційні алгебраїчні форми, коли це можливо. Froid моделює блоки імперативного коду як реляційні вирази і систематично поєднує їх в єдиний вираз за допомогою оператора Apply, тим самим дозволяючи оптимізатору запитів вибирати ефективні паралельні плани запитів, орієнтовані на набір .
(наголос мій)
Вбудовані скалярні функції T-SQL тепер реалізовані в SQL Server 2019 .