首页 > 解决方案 > 提高 SQL Server 2012 的 UPDATE/DELETE 性能

问题描述

我们的项目中有一个过程,其中删除了具有特定标志的表中的记录并更新了剩余记录的标志。

表有大约 4500 万条记录,其中一半的记录带有 flag='C',剩下的一半带有 flag='P'。

进程每天运行一次以删除所有带有“P”标志的记录,然后更新所有带有“C”标志的剩余记录

下面是通过 SSIS 包运行的两个语句。

DELETE FROM dbo.RTL_Valuation WITH (TABLOCK) 
WHERE Valuation_Age_Flag = 'P';

UPDATE dbo.RTL_Valuation WITH (TABLOCK) 
SET Valuation_Age_Flag = 'P' 
WHERE Valuation_Age_Flag = 'C';

目前该过程需要 60 分钟才能完成。有什么办法可以改善处理时间吗?

谢谢

标签: sql-server

解决方案


您需要一次执行 10000 行。您正在创建一个在事务日志中占用大量空间的巨大事务(因此可以回滚)。

     set nocount on
      DELETE  top (10000) FROM dbo.RTL_Valuation   WHERE valuation_Age_Flag = 'P';    
    while @@rowcount()>0

    begin
     DELETE  top (10000) FROM dbo.RTL_Valuation   WHERE valuation_Age_Flag = 'P';    
end

您可以尝试 1,000、5,000 或其他一些数字来确定在安装 SQL Server 时从大表中快速删除行的最佳“神奇”数字。但是进行大删除会快得多。相同的逻辑适用于更新。


推荐阅读