【问题标题】:Why delete rows seems to be slow in SQL Server?为什么删除行在 SQL Server 中似乎很慢?
【发布时间】:2020-07-26 10:24:52
【问题描述】:

我有 2 个表,其中一个学生姓名有 35 M 行,另一个表(名称为索引)有 1500 行。

当我使用这个查询时:

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

运行并返回结果大约需要 3 秒(假设它有 3500 万行,但很快就会返回结果)。

但是当我跑步时

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

这很慢,我等了三十分钟,但还没有完成。

为什么?

【问题讨论】:

  • 如果定义了外键,引擎需要检查这个外键。当您没有此外键列的索引时,这将非常慢。同样使用not exists 代替not in 可能会提高性能。

标签: sql-server performance sql-delete


【解决方案1】:

这是一个苹果与橘子的比较,因为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) 

【讨论】:

    猜你喜欢
    • 2014-11-26
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-08
    • 2019-04-09
    相关资源
    最近更新 更多