我必须对具有大量记录的表进行3年的更新声明,每个月有100万条记录。
我尝试使用批处理脚本,但是它花费了很长时间,因此我在结束之前将其取消。
能否请您提出最有效的方法来完成此任务?
谢谢。
此致
治疗的主要代码是:
UPDATE [XXXX_DWH].[Dwh].[Invoice]
SET OrderingCustomerCode = SUBSTRING(orderingcustomercode, 2, 7)
WHERE InvoicingYear = '2019' AND InvoicingMonth = '01'
答案 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