首页 > 数据库 > mysql教程 > 为什么在 WHERE 子句中使用日期时间表达式时 My SQL Server 2008 查询速度很慢?

为什么在 WHERE 子句中使用日期时间表达式时 My SQL Server 2008 查询速度很慢?

Barbara Streisand
发布: 2024-12-18 17:03:13
原创
896 人浏览过

Why is My SQL Server 2008 Query Slow When Using DateTime Expressions in the WHERE Clause?

与 DateTime 表达式的查询性能差异

与字符串文字值相比,在 WHERE 子句中使用日期表达式时,查询会出现明显的速度下降,从而导致查询性能陷入困境。让我们更深入地研究这个问题并寻求解决方案。

根本原因

性能差距的产生是由于 SQL Server 2008 中的一个错误,该错误会影响在日期表达式中使用日期表达式时的基数估计。 WHERE 子句。该错误会导致匹配行数的估计不正确。

优化查询

为了规避此错误,建议使用以下优化查询:

Where FK.DT = cast(getdate() + 1 - datepart(day, getdate()) as date)
登录后复制

此表达式返回当前月份的开始时间,这可能是此场景中所需的选择标准。

跟踪标志4199

或者,可以启用跟踪标志 4199 以强制进行准确的基数估计。打开跟踪标志 4199 时,以下查询还将生成所需的计划:

Where FK.DT = CAST(DATEADD(m, DATEDIFF(m, 0, getdate()), 0) as DATE)  
OPTION (QUERYTRACEON 4199)
登录后复制

示例

例如,名为 FK 的表包含名为 DT 的列,其值表示开始每个月的以下两个查询展示了性能差异:

-- Slow due to incorrect cardinality estimates
SELECT COUNT(Filler)
FROM FK
WHERE FK.DT = CAST(DATEADD(m, DATEDIFF(m, 0, getdate()), 0) AS DATE)  

-- Fast due to accurate cardinality estimates with trace flag 4199
SELECT COUNT(Filler)
FROM FK
WHERE FK.DT = CAST(DATEADD(m, DATEDIFF(m, 0, getdate()), 0) AS DATE)  
OPTION (QUERYTRACEON 4199)
登录后复制

启用跟踪标志 4199,由于优化的查询计划,第二个查询将显着加快执行时间。

以上是为什么在 WHERE 子句中使用日期时间表达式时 My SQL Server 2008 查询速度很慢?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板