gpt4 book ai didi

sql - 使用日期表达式查询运行缓慢,但使用字符串文字查询运行速度很快

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

我正在 SQL Server 2008 中运行具有以下条件的查询。

Where FK.DT = CAST(DATEADD(m, DATEDIFF(m, 0, getdate()), 0) as DATE)  

在上述条件下查询需要永远运行,但如果只是说

Where FK.DT = '2013-05-01' 

2 分钟内运行良好。 FK.DT 键仅包含该月的起始数据的值。

任何帮助,我只是不知道为什么会发生这种情况。

最佳答案

这可能会更好:

Where FK.DT = cast(getdate() + 1 - datepart(day, getdate()) as date)

除非您使用跟踪标志 4199 运行,否则 a bug这会影响基数估计。在撰写本文时

SELECT DATEADD(m, DATEDIFF(m, getdate(), 0), 0), 
DATEADD(m, DATEDIFF(m, 0, getdate()), 0)

返回

+-------------------------+-------------------------+
| 1786-06-01 00:00:00.000 | 2013-08-01 00:00:00.000 |
+-------------------------+-------------------------+

错误在于,问题中的谓词在推导基数估计时使用第一个日期而不是第二个日期。因此进行以下设置。

CREATE TABLE FK
(
ID INT IDENTITY PRIMARY KEY,
DT DATE,
Filler CHAR(1000) NULL,
UNIQUE (DT,ID)
)

INSERT INTO FK (DT)
SELECT TOP (1000000) DATEADD(m, DATEDIFF(m, getdate(), 0), 0)
FROM master..spt_values o1, master..spt_values o2
UNION ALL
SELECT DATEADD(m, DATEDIFF(m, 0, getdate()), 0)

查询 1

SELECT COUNT(Filler)
FROM FK
WHERE FK.DT = CAST(DATEADD(m, DATEDIFF(m, 0, getdate()), 0) AS DATE)

Plan 1

估计匹配行数将为 100,000。这是与日期'1786-06-01'匹配的数字。

但是以下两个查询

SELECT COUNT(Filler)
FROM FK
WHERE FK.DT = CAST(GETDATE() + 1 - DATEPART(DAY, GETDATE()) AS DATE)

SELECT COUNT(Filler)
FROM FK
WHERE FK.DT = CAST(DATEADD(m, DATEDIFF(m, 0, getdate()), 0) AS DATE)
OPTION (QUERYTRACEON 4199)

给出这个计划

Plan 2

由于基数估计更加准确,该计划现在只执行单个索引查找而不是完整扫描。

关于sql - 使用日期表达式查询运行缓慢,但使用字符串文字查询运行速度很快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18241977/

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