如果我在where子句中使用一个函数,它会被计算多少次?我想知道在更复杂的查询中对性能的影响。
示例:
select
col1, col2, expirationDate
from someTable
where expirationDate > getdate()对比
declare @today date = getdate()
select
col1, col2, expirationDate
from someTable
where expirationDate > @today发布于 2015-04-25 01:16:15
FTA:
SQL Server有一个称为“运行时常量”的概念,其中一些表达式从树中拉出并在提取行之前执行。结果被缓存并在查询中的所有位置重用。..。getdate()是一个
发布于 2015-04-25 01:13:13
如果我没记错的话,Sql server将GETDATE()作为确定性执行进行求值,并且只对GETDATE()求值一次,而不是针对每一行。
GETDATE编辑:我想我错了-- GETDATE()总是不确定的。相反,GETDATE()被视为查询中的运行时常量函数。Here是一篇解释它的文章。
发布于 2015-04-25 10:17:11
通常情况下,您不应在函数中包含要过滤的列。
由于您没有将expirationDate封装在任何函数中,因此查询优化器可以在编译时访问列expirationDate的值,因此它不会影响性能(即,如果您在expirationDate上有一个索引)
对于example,如果expirationDate被封闭在某个函数中,比如DATEPART,那么编译器将不会选择索引而不是该列,即使它存在。
此外,如上所述,GETDATE()被视为一个runtime constant function,其中表达式从树中拉出并在提取行之前执行。然后将结果缓存并在查询中的所有位置重复使用
https://stackoverflow.com/questions/29853501
复制相似问题