我有特定的清理代码试图删除一些重复项。
这在许多客户站点上完美运行。日志告诉我此查询至少消耗了 1 秒到 45 秒:
DELETE FROM [tbl]
WHERE [Id] NOT IN
(
SELECT MIN([Id])
FROM [tbl]
GROUP BY [IdProject], [IdRepresentative], [TimeStart]
)
Run Code Online (Sandbox Code Playgroud)
但是我有一个客户,该查询运行了 4 个多小时(到现在为止还没有结束)!我检查了数据库 ( DBCC CHECKDB
),我已经更新了统计信息 ( sp_updatestats
),也UPDATE STATISTICS [tbl] WITH FULLSCAN
显示没有变化。
我有来自客户的 DB 的原始备份。我在 SQL Server 14.0.2002.14 上运行它。我有标准版,客户用的是速成版。
我可以在活动监视器中看到没有其他人在使用数据库。没有等待,CPU 使用率为 25%(正好是我的 4 个 CPU 中的 1 个)。同样在我的测试用例中,没有其他人在使用数据库。
我重新查询并检查了以下语句:
DELETE FROM [tbl]
FROM [tbl] AS t
LEFT OUTER JOIN
(
SELECT MIN([Id]) AS [IdMin]
FROM [tbl]
GROUP BY [IdProject], [IdRepresentative], [TimeStart]
) …
Run Code Online (Sandbox Code Playgroud) performance sql-server execution-plan cardinality-estimates sql-server-2017 query-performance