如果我在where子句中使用函数,它会被评估多少次?我想知道在更复杂的查询中对性能的影响。
示例:
select
col1, col2, expirationDate
from someTable
where expirationDate > getdate()
与
declare @today date = getdate()
select
col1, col2, expirationDate
from someTable
where expirationDate > @today
答案 0 :(得分:3)
答案 1 :(得分:0)
如果我没记错的话,Sql server会将GETDATE()评估为确定性执行,并且会评估GETDATE()一次,而不是每行。
编辑:我认为我错了 - GETDATE()总是不确定的。 相反,GETDATE()被视为查询中的运行时常量函数。 Here是一篇解释它的文章。
答案 2 :(得分:0)
通常,您不应在函数中包含要过滤的列。
由于您没有在任何函数中包含expirationDate
,因此查询优化器可以在编译时访问列expirationDate
的值,因此它不会影响性能(即,如果您有{ {1}})
对于example,如果expirationDate
在某个函数中声明expirationDate
,则编译器将不会选择该列的索引,即使它存在。
另外,如上所述,DATEPART
被视为runtime constant function,其中表达式被拉出树并在获取行之前执行。然后在查询中的所有位置缓存并重复使用结果