gpt4 book ai didi

sql - SQL Server 是否优化 select 查询中的 DATEADD 计算?

转载 作者:行者123 更新时间:2023-12-03 01:03:45 24 4
gpt4 key购买 nike

我在 Sql Server 2008 上有一个这样的查询:

DECLARE @START_DATE DATETIME
SET @START_DATE = GETDATE()

SELECT * FROM MY_TABLE
WHERE TRANSACTION_DATE_TIME > DATEADD(MINUTE, -1440, @START_DATE)

在上面看到的选择查询中,SqlServer 是否优化了查询以避免一次又一次地计算 DATEADD 结果。或者将 DATEADD 结果存储在临时变量中是我自己的责任吗?

最佳答案

被视为 runtime constants 的 SQL Server 函数仅评估一次。 GETDATE() 就是这样一个函数,DATEADD(...,constant, GETDATE()) 也是一个运行时常量。通过将实际的函数调用留在查询中,您可以让优化器查看实际使用的值(而不是变量值嗅探),然后它可以相应地调整其基数估计,可能会提出更好的计划。

另请阅读:Troubleshooting Poor Query Performance: Constant Folding and Expression Evaluation During Cardinality Estimation .

@马丁·史密斯

您可以运行此查询:

set nocount on;
declare @known int;
select @known = count(*) from sysobjects;
declare @cnt int = @known;
while @cnt = @known
select @cnt = count(*) from sysobjects where getdate()=getdate()
select @cnt, @known;

在我的例子中,22 秒后它到达了边界情况并且循环退出。重要的是循环以 @cnt 0 退出。人们会期望,如果每行计算 getdate() ,那么我们将得到一个与正确的 @known 计数不同的 @cnt,但不是 0。事实上,当循环存在时,@cnt 为零显示每个 getdate() 被评估一次,然后对每一行 WHERE 过滤使用相同的常量值(不匹配)。我知道一个正面的例子并不能证明一个定理,但我认为这个例子已经足够结论了。

关于sql - SQL Server 是否优化 select 查询中的 DATEADD 计算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7301058/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com