【问题标题】:SQL Server 2005: Delete OptimizationSQL Server 2005:删除优化
【发布时间】: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)工具栏以很好地格式化和语法突出显示它!

标签: sql sql-server sql-server-2005 query-optimization


【解决方案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 ExistsIn vs Exists。自己做一些实验。如果您发现任何不同,请告诉我!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多