【发布时间】:2010-11-10 17:38:56
【问题描述】:
我有一个查询,当像这样运行时执行得非常好:
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 '嘿,伙计,这是我们得到的 常量 值,并相应地优化计划?
【问题讨论】:
标签: sql sql-server performance tsql