SQL * Server用户定义的标量函数的常量值 - 性能

时间:2010-11-10 17:38:57

标签: sql sql-server performance tsql

我有一个在这样运行时表现非常好的查询:

SELECT YADAYADA FROM MYTABLE WHERE FVAL <= 100 AND TVAL >= 100

由于(FVAL,TVAL)有一个索引,因此查询完全是最优的,因为非聚集索引搜索整个查询。

现在,在这里使用从用户定义的函数返回的常量会很好。该函数将为整个事务返回一个常量值,而不仅仅是此查询。但这样做:

SELECT YADAYADA FROM MYTABLE WHERE FVAL <= dbo.myVal() AND TVAL >= dbo.myVal()

产生次优结果 - 查询计划不再作为索引搜索很好地运行,而是坚持寻找然后过滤,这显然 MUCH 更慢 - 即使在这个例子中,我的函数定义为在这个非常简单的情况下返回一个常量值。

我尝试过使用BETWEEN条款 - 没有更好的。我已经尝试了表值函数,没有更好的(实际上,查询计划变得越来越复杂)。

是否有任何说服SQL * Server的方式'嘿伙计,这是我们到这里的常数值,并相应地优化计划?

2 个答案:

答案 0 :(得分:1)

您可以做的最好的事情是在查询中声明一个变量,将UDF的值赋给该变量,然后在查询中使用该变量。

答案 1 :(得分:1)

SQL Server试图变得聪明,并建议查询的值是什么,但有时开发人员会更清楚。

以下概念可以帮助您

DECLARE @fval INT
DECLARE @tval INT
SET @fval = dbo.myVal()
SET @tval = dbo.myVal()

SELECT YADAYADA FROM MYTABLE WHERE FVAL <= @fval AND TVAL >= @tval
OPTION (OPTIMIZE FOR(@fval= 100, @tval = 100))