为什么在 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)
我有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)