У меня есть запрос, который использует вложенные CTE в пользовательской функции. Я должен использовать вложенные CTE, потому что я хочу повторно использовать некоторые вычисления / операторы из предыдущих выборок. Запрос выглядит так, как показано ниже.
;with cte1 as
(
select a, b from Table1
),
ct2 as
(
case when a =1 then 1 else 0 end as c, b from cte2
)
select * from cte2
У меня есть это в udf, который вызывается из нескольких сохраненных процедур. В этом запросе выполняется большое количество вычислений. Я замечаю разницу в производительности, когда запрос выполняется вне функции. Приблизительно для 12 000 записей он выполняется менее чем за 11 секунд, когда запрос запускается из студии управления SQL с применением всех параметров. Когда те же параметры передаются в udf, это занимает около 55 секунд. Я попытался поместить запрос в хранимый процесс вместо udf, но все равно те же 55 секунд. Похоже, что когда запрос запускается из консоли управления, он использует параллелизм для запроса, но не для функции или хранимого процесса.
На данный момент это не главная проблема, но я хотел бы добиться того же 11-секундного исполнения, если смогу. Кто-нибудь сталкивался с подобным сценарием раньше?