SQL Server中的大型更新语句

时间:2019-06-24 08:40:25

标签: sql-server batch-processing

我必须对具有大量记录的表进行3年的更新声明,每个月有100万条记录。

我尝试使用批处理脚本,但是它花费了很长时间,因此我在结束之前将其取消。

能否请您提出最有效的方法来完成此任务?

谢谢。

此致

治疗的主要代码是:

UPDATE [XXXX_DWH].[Dwh].[Invoice]
SET OrderingCustomerCode = SUBSTRING(orderingcustomercode, 2, 7)
WHERE InvoicingYear = '2019' AND InvoicingMonth = '01'

1 个答案:

答案 0 :(得分:1)

有几种可能。如果必须更改整个表,则使用更改创建表的副本然后重命名表(重新创建所有索引等以使对象相同)可能会更快。如果只需要更改表的一部分,则可以插入要更改为另一表的行,从发票中删除这些行,然后从临时表中将它们重新插入到发票中。

select col1, col2, SUBSTRING(orderingcustomercode, 2, 7) as orderingcustomercode ... the rest of columns
into [XXXX_DWH].[Dwh].[Invoice_temp]
from [XXXX_DWH].[Dwh].[Invoice]

每次仅更新10万个也是一个不错的选择,但是我认为如果列存储索引中有数百万行,则第一种方法更好。批处理减少由更新产生的事务日志。使sql server能够搜索此where InvoicingYear='2019' and InvoicingMonth='01'是否具有InvoiceDate分区也很好。

DECLARE @output INT = 1

while @output > 0
begin
with cte as 
    (select top 100000 *
    from [XXXX_DWH].[Dwh].[Invoice]
    where InvoicingYear='2019' and InvoicingMonth='01')
update cte
set OrderingCustomerCode=SUBSTRING(orderingcustomercode,2,7)

SET @output = @@ROWCOUNT

end