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 server2005上千万条数据分页查询怎么做优化?