我有一个在这样运行时表现非常好的查询:
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的方式'嘿伙计,这是我们到这里的常数值,并相应地优化计划?
答案 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))