我无法想出加快这种速度的方法。它正在进行表扫描,但我必须这样做,因为我需要更新所有记录......
问题是这张表有数百万条记录......大约有3000万条。
这需要大约50分钟才能运行。任何人都有关于如何改进这个的提示吗?
update A
set A.product_dollar_amt = round(A.product_dollar_amt, 2),
A.product_local_amt = round(A.product_local_amt, 2),
A.product_trans_amt = round(A.product_trans_amt, 2)
from dbo.table A
该表当前是一个堆(没有聚簇索引),因为它没有在其他任何地方使用...不确定创建聚簇索引是否会改善这里的任何内容。
答案 0 :(得分:4)
以下是三个选项。
Randy首先提到的是分批完成工作。
第二种方法是将结果转储到临时表中并重新创建原始表:
if ($('#div-konoce').html() == '')
注意:这不能保证更快,但是因为日志记录插入比记录更新更快,所以通常是。此外,您还需要重建索引和触发器。
最后,还有#34; no-update"解决方案:改为创建派生值:
<div id = "div-konoce"> </div>
然后将列添加回公式:
select . . . ,
product_dollar_amt = round(A.product_dollar_amt, 2),
product_local_amt = round(A.product_local_amt, 2),
product_trans_amt = round(A.product_trans_amt, 2)
into a_temp
from a;
drop a;
sp_rename 'a_temp', 'a';
答案 1 :(得分:2)
你真的没有其他选择。您正在更新每一行,并且只要需要就行。我可以告诉你,在单个事务中更新30M行并不是一个好主意。您可以轻松地清除事务日志。如果其他用户使用此表,您可能会将其全部锁定,直到整个表更新为止。您最好小批量更新此表。总体性能不会得到改善,但是你会对你的trans日志和其他用户施加更小的压力。
答案 2 :(得分:0)
关闭所有开销:禁用/删除索引,关闭允许时间点恢复的事务日志记录等。在您的情况下,索引不会因为您没有更新索引列而受到损害,或者添加新行。
理论上使用16核系统(x2用于CPU架构上的超线程)。如果你没有其他瓶颈(磁盘io),50分钟的工作将在3分钟内完成。