为什么在 SQL 服务器中删除行似乎很慢?

Why delete rows seems to be slow in SQL Server?

我有2个table,其中一个学生名字有35M行,另一个table(name is index)有1500行。

当我使用这个查询时:

SELECT DISTINCT family 
FROM [DBName].[dbo].[student] 

运行 和 return 结果大约需要 3 秒(假设它有 3500 万行,但很快 return 结果)。

但是当我运行

DELETE FROM [DBName].[dbo].[index] 
WHERE family NOT IN (SELECT DISTINCT family FROM [DBName].[dbo].[student]) 

太慢了,我等了三十分钟还没完成。

为什么?

这是一个苹果与橘子的比较,因为 DELETE 正在写入事务日志而 SELECT 而不是

DISTINCT 的工作原理是对输出行进行排序以查找重复项。如果您缺少索引,这将变得非常慢(因为它值得 3 秒的输出对我来说似乎很慢)。在同一列上执行 NOT IN 时甚至更慢。这没有考虑您对该列可能有的任何限制,这可能会进一步减慢它的速度。

您可以使用 GROUP BY 来加快速度。

DELETE 
FROM      [DBName].[dbo].[index] 
WHERE     family NOT IN (
            SELECT      family 
            FROM        [DBName].[dbo].[student]            
            GROUP BY    family) 

使用 NOT EXISTS 而不是 NOT IN 可能更快:

DELETE 
FROM      [DBName].[dbo].[index] AS outer
WHERE     family NOT EXISTS (
            SELECT      family 
            FROM        [DBName].[dbo].[student] AS inner
            WHERE       inner.family = outer.family
            GROUP BY    family)