3

我有一个如下所示的查询:

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

问题是查询优化器正在子查询中移动 UDF,它在相当严格的“someField = 1”条件之前应用。不幸的是,UDF 的速度并不快,这导致了糟糕的性能。有什么方法可以防止这种情况(除了使用临时表)或向 sql server 建立 UDF 很昂贵吗?

提前致谢

4

2 回答 2

2

“相当严格的 'someField = 1' 条件”

您在该列上有索引吗?如果 SQL 认为这样做会更快,那么它应该只应用标量函数。如果您有一个第一列是“someField”的索引,那么我建议您确保该表的统计信息是最新的。

于 2010-11-10T18:53:44.637 回答
0

一种方法是使用临时表或表变量:

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

临时看起来比他们贵。事实上,大多数连接都是使用临时帮助表执行的 :)

于 2010-11-10T19:28:37.557 回答