【问题标题】:Slow Execution - DateAdd and DateDiff in WHERE clause [duplicate]执行缓慢 - WHERE 子句中的 DateAdd 和 DateDiff [重复]
【发布时间】:2014-07-18 05:24:28
【问题描述】:
... AND (Orders.ShipDate >= DATEADD(MONTH, Datediff(MONTH, 0, GetDate()) -12), 0)
    AND Orders.ShipDate < DATEADD(MONTH, Datediff(MONTH, 0, GetDate()), 0)

我最初使用的是

CAST(FLOOR(CAST .....

删除 where 子句中的时间组件,查询执行时间为 6 分钟 - 此方法依赖于静态表,因此我决定不再使用该方法。使用 DATEADDDATEDIFF 组合,我的查询在 40 分钟后仍在运行。

这是 SQL Server 2005 和 2008 中的一个已知问题,根据: MSDN Blog Article

由于这是一个视图,我如何预先计算 FROMTO 日期并传递实际值以减少查询执行期间的传递次数?

【问题讨论】:

  • 在 SQL Server 2008 上,您可以使用 CAST(YourColumn AS DATE) 来“删除”时间部分 - 如果您不需要时间,也可以使用 DATE 数据类型!
  • 运行 SELECT DATEADD(MONTH, Datediff(Day, 0, GetDate() -12), 0) 给我一个日期“5385-05-01 00:00:00.000”。也许这就是问题所在?
  • 副本中接受的答案有另一种表达方式(或跟踪标志的详细信息),可以避免问题。

标签: sql sql-server sql-server-2008 sql-server-2005


【解决方案1】:

您正在计算“第 0 天”和现在之间的天数,但要加上该月数。您可能需要更正它...否则它对我来说看起来足够好(只是)。

【讨论】:

  • 提供的示例代码不正确,但生产代码正确。问题是当同时使用 datediff 和 dateadd 时,查询速度会变慢
  • @MervinPadayachee 你看过跟踪标志 4199 了吗?
  • 如果你先计算值,它会以“正常速度”运行?
  • 我同意确保您使用了 traceflag 4199。使用OPTION (QUERYTRACEON 4199) 测试影响
猜你喜欢
  • 1970-01-01
  • 2022-06-15
  • 2011-10-21
  • 2015-07-20
  • 1970-01-01
  • 2018-10-05
  • 1970-01-01
  • 2021-11-15
  • 2012-07-16
相关资源
最近更新 更多