1

我使用 MSSQL Server 2008,我有简单条件的 SQL 请求,它定期从表中删除旧记录(表中约 3 百万条记录)。

即使它影响 0 行,该请求也会执行大量时间(约 10 秒)。

该表有一些索引,在实际执行计划中我看到“索引删除”操作消耗了所有执行时间。

如果没有任何行受删除操作影响,为什么 SQL Server 会在索引上做很多工作?

更新:

要求:

delete t
from Entity t
where t.Revision <= x
AND exists (
    select 1
    from Entity tt
    where tt.Id=t.Id
    and tt.Revision > t.Revision
) 

实际执行计划 XML:pastebin.com/up2E3iP1

4

3 回答 3

2

工作都是在做哈希连接。所有其他费用都是假的。

从中得出的实际行数是,0但它估计更多。

计划

计划其余部分中显示的成本基于(不正确的)估计。

您可能会发现这表现得更好。

WITH T AS
(
SELECT *,
       ROW_NUMBER() OVER (PARTITION BY Id 
                              ORDER BY Revision DESC) AS RN
FROM Entity
)
DELETE FROM T
WHERE RN > 1
AND Revision <= 12586705
于 2013-08-23T14:06:28.413 回答
0

我发现连接比子查询更高效。

试试这个

delete t
from Entity t
inner join Entity tt ON tt.Id=t.Id
where t.Revision <= x
and tt.Revision > t.Revision

此外,请确保您有关于 Id 和 Revision 的索引。

于 2013-08-23T13:45:19.390 回答
0

不要忘记,即使您不打算删除任何记录,SQL 仍然必须检查以确认没有要删除的记录。您之间的连接Entity tEntity tt有一个 < ,这将需要一些额外的工作。在运行删除之前尝试SET STATISTICS IO ON在查询窗口中运行。我敢打赌,即使有索引,也会有相当数量的 IO 进行。我假设你有一个索引Id, Revision?如果没有,您可以尝试添加一个。

于 2013-08-23T13:45:36.377 回答