2010-11-10 69 views
1

我有这样当运行很好地执行查询:SQL *服务器常数值 - 性能

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 *服务器是“嘿,伙计,这是我们在这里得到一个不断值,并相应地优化计划的任何方式

回答

1

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

+0

我能做到这一点 - 但最终这个SQL还藏着一个视图(因此需要首先使用UDF中,它实际上是从CONTEXT_INFO拉)..我不能把DECLARE放在视图中。我可以把整个事情放在用户TDF或存储过程中 - 然后隐藏查询优化器中的所有其他列:-( – user340535 2010-11-10 18:04:56

+0

)不幸的是,它看起来并不像你能得到你想要的那样。将不得不执行UDF将在视图中执行的所有查找。 – 2010-11-10 19:33:46

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))