gpt4 book ai didi

sql-server - 请确认: SYSDATETIME() is slower than GETDATE() in WHERE clause

转载 作者:行者123 更新时间:2023-12-02 06:23:47 25 4
gpt4 key购买 nike

我有一个查询返回数千条记录,这些记录跨多个表连接。在 WHERE 子句中,检查日期是否不超过过去两个月。首先,查询将此日期边界设置为变量,并在 WHERE 中使用它。

DECLARE @startdate as DATE = DATEADD(MONTH, -2, SYSDATETIME())

select [....]
where dateinquestion >= @startdate

这运行得很好(在 4 秒内返回预期的结果),但我想摆脱变量声明并将赋值移到 WHERE 子句本身:

select [....]
where dateinquestion >= DATEADD(MONTH, -2, SYSDATETIME())

它运行了超过一分钟并耗尽了所有 CPU。我终止了查询以停止推送服务器,但没有给出任何结果。更改为 GETDATE() (无论如何我不需要 SYSDATETIME() 的精度)加快速度:

select [....]
where dateinquestion >= DATEADD(MONTH, -2, GETDATE())

结果与场景 1 类似。

我相信这是因为 SYSDATETIME 是在每行的基础上进行评估的,因为处理一行需要几纳秒的时间,这对 SYSDATETIME 来说很重要。然而,GETDATE 具有较高的更改阈值,因此不受影响(或影响较小),并且不会在每行基础上更改或需要重新评估。

你能确认一下吗?我对这种行为的假设正确吗?

我已经搜索过这个,但除了这个之外找不到任何东西,它只涉及将 SYSDATETIME() 分配给变量,而不是在 WHERE 中使用它: Does SYSDATETIME() cost more than GETDATE()?

也是这样,但示例中只使用了 GETDATE: TSQL datetimes functions in where clause

最佳答案

GETDATESYSDATETIME 之间最重要的区别是返回值的类型。 SYSDATETIME 不会针对每一行进行评估,与 GETDATE 不会针对每一行进行评估相同。他们是Runtime Constant Functions另请参阅https://dba.stackexchange.com/questions/18459/does-sql-server-evaluate-functions-once-for-every-row

dateinquestion 列的类型是什么?

当您使用@startdate变量时,您将SYSDATETIME的结果转换为date。当您不使用变量时,DATEADD 的结果在您的示例中具有不同的类型。

要使 GETDATESYSDATETIME 的查询等效,您可以显式转换为 date:

比较

select [....]
where dateinquestion >= CAST(DATEADD(MONTH, -2, SYSDATETIME()) AS date)

对比

select [....]
where dateinquestion >= CAST(DATEADD(MONTH, -2, GETDATE()) as date)

如果这两个查询的运行方式不同,我会感到惊讶。

理想情况下,您应该将它们转换为与 dateinquestion 具有相同的类型。

您说过 SYSDATETIME 的变体使用大量 CPU。如果 dateinquestion 的类型为 datetime,那么可能的解释可能是这样的。在此变体中,dateinquestion 列中的值似乎在比较之前隐式转换为 datetime2(7) 类型。对于每一行。首先,它使用CPU。其次,它可能会阻止优化器在此列上使用索引(如果有索引)。

要了解到底发生了什么,而不是猜测,请比较两个变体的实际执行计划。

顺便说一下,带有变量的变体并不等同于优化器的内联变体。优化器不知道变量的值,但它知道 GETDATE()SYSDATETIME() 的值,因此基数估计不同,这可能会导致不同的计划和不同的表现。

关于sql-server - 请确认: SYSDATETIME() is slower than GETDATE() in WHERE clause,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29387398/

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