SQL Server 2005:删除优化

Posted

技术标签:

【中文标题】SQL Server 2005:删除优化【英文标题】:SQL Server 2005: Delete Optimization 【发布时间】:2010-09-08 16:32:03 【问题描述】:

这是从DeletedProducts 表中删除ProductFileInfo 表中没有引用的最有效方法吗?

示例:

DELETE FROM DeletedProducts 
WHERE ProductId NOT IN SELECT DISTINCT ProductID FROM ProductFileInfo

或者NOT EXIST 是执行此操作的更好方法。

注意:ProductFileInfo 中有超过 2000 万条记录。

我使用的是 SQL Server 2005 Standard。

谢谢

【问题讨论】:

如果您发布 (T-SQL) 代码或 XML,在文本编辑器中突出显示这些行,然后单击编辑器上的“代码”按钮 (101 010)工具栏以很好地格式化和语法突出显示它! 【参考方案1】:

NOT IN 和 NOT EXISTS 可能会产生相同的计划。你要删除多少行?如果它很多,我会批量处理 5K 或 10K,这样你就不会用一个大事务填充你的 LOG,然后如果它因任何原因失败,它需要做一个大回滚

例如

DELETE top 5000
from sometable
where ....
go 100 --will be executed 100 times

为了让 GO N 工作,您需要 SSMS 和 service pack 2 (IIRC) 但当然您也可以编写一个 while 循环..while @@rowcount > 0.......

【讨论】:

【参考方案2】:

尝试多种解决方案并测试其性能,YMMV。 也可以尝试外部连接

DELETE FROM DeletedProducts d left outer join ProductFileInfo p
on d.ProductId  = p.ProductId  WHERE p.ProductID is null

【讨论】:

【参考方案3】:

嗯,我通常会写一些类似的东西

delete d
from TableToDeleteFrom d
where not exists(select top 1 1 from SomeOtherTable sot where sot.ThatId = d.ThatId)

可能你不想锁定查找表,所以可以指定with(readpast)hint 或with(nolock)

【讨论】:

【参考方案4】:

这是一个很好的资源,可以满足您的要求。

http://www.sql-server-performance.com/tips/t_sql_where_p3.aspx

【讨论】:

我查看了前几个提示,它们似乎非常可疑(也许它们曾经是正确的,但它们对于 SQL Server 2005+ 完全不正确) 这对你来说太不公平了,这是由社区中一位受人尊敬的作者撰写的,而我最近在 2 周前看到了其他受人尊敬的演讲者在多篇文章上发表的多次演讲。 @daytona - 我也有点惊讶,布拉德·麦吉的名字除此之外。我想知道他是不是前段时间写的,其他人更新它说它适用于SQL2005。在 SQL 2005+ 中虽然 Not In vs Not Exists 和 In vs Exists。自己做一些实验。如果您发现任何不同,请告诉我! 还有兴趣Left outer join vs NOT EXISTS

以上是关于SQL Server 2005:删除优化的主要内容,如果未能解决你的问题,请参考以下文章

工作查询优化 (SQL Server 2005)

工作 SQL Server 2005 查询优化

在 SQL Server 2005+ 中获取列总计的最优化方法

SQL server2005上千万条数据分页查询怎么做优化?

SQL Server 2008 收缩日志 清空删除大日志文件

SQL Server 2008 收缩日志 清空删除大日志文件