SQL Server - CLR сохраняет процедуру в скалярной функции, так как фильтр не взвешен должным образом в оптимизаторе запросов ==> BAD EXECUTION PLAN - PullRequest
3 голосов
/ 10 ноября 2010

У меня есть запрос, который выглядит следующим образом:

SELECT someString  FROM
(
    SELECT someString FROM someTable
    WHERE someField = 1
) X
WHERE dbo.fnMyClrScalarFunction(X.someString) = 0

Проблема в том, что оптимизатор запросов перемещает UDF внутри подзапроса, где он применяется перед довольно ограничительным 'someField = 1'состояние.К сожалению, UDF не совсем быстрый, и это приводит к ужасной производительности.Есть ли способ предотвратить это (кроме использования временной таблицы) или установить для сервера SQL, что UDF стоит дорого?

Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 10 ноября 2010

«довольно ограниченное» условие someField = 1 «»

У вас есть индекс для этого столбца.SQL должен применять скалярную функцию только в том случае, если он считает, что это будет быстрее.Если у вас есть индекс, где первый столбец - это someField, я бы порекомендовал вам убедиться, что статистика для этой таблицы обновлена.

0 голосов
/ 10 ноября 2010

Одним из способов является использование временной таблицы или табличной переменной:

declare @t table (SomeString varchar(100))
insert @t select someString from someTable where someField = 1
select someString from @t where  dbo.fnMyClrScalarFunction(someString) = 0

Временные выглядят дороже, чем они.Фактически, большинство соединений выполняются с использованием временных вспомогательных таблиц:)

...