在where子句中使用函数:评估函数的次数是多少次?

时间:2015-04-24 17:09:56

标签: sql sql-server

如果我在where子句中使用函数,它会被评估多少次?我想知道在更复杂的查询中对性能的影响。

示例:

select 
col1, col2, expirationDate
from someTable
where expirationDate > getdate()

declare @today date = getdate()
select 
col1, col2, expirationDate
from someTable
where expirationDate > @today

3 个答案:

答案 0 :(得分:3)

It is only evaluated once.

FTA:

  

SQL Server有一个名为“运行时常量”的概念,其中一些表达式从树中拉出并在获取行之前执行。结果将在查询中的所有位置进行缓存和重用。   ...   getdate()是一个

额外阅读DBA

答案 1 :(得分:0)

如果我没记错的话,Sql server会将GETDATE()评估为确定性执行,并且会评估GETDATE()一次,而不是每行。

编辑:我认为我错了 - GETDATE()总是不确定的。 相反,GETDATE()被视为查询中的运行时常量函数。 Here是一篇解释它的文章。

答案 2 :(得分:0)

通常,您不应在函数中包含要过滤的列。

由于您没有在任何函数中包含expirationDate,因此查询优化器可以在编译时访问列expirationDate的值,因此它不会影响性能(即,如果您有{ {1}})

对于example,如果expirationDate在某个函数中声明expirationDate,则编译器将不会选择该列的索引,即使它存在。

另外,如上所述,DATEPART被视为runtime constant function,其中表达式被拉出树并在获取行之前执行。然后在查询中的所有位置缓存并重复使用结果