有没有什么方法可以提高这个简单查询的性能?

时间:2016-05-05 00:12:04

标签: sql sql-server performance

我无法想出加快这种速度的方法。它正在进行表扫描,但我必须这样做,因为我需要更新所有记录......

问题是这张表有数百万条记录......大约有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

该表当前是一个堆(没有聚簇索引),因为它没有在其他任何地方使用...不确定创建聚簇索引是否会改善这里的任何内容。

3 个答案:

答案 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)

  1. 使用允许查询执行此操作的选项或提示来并行化您的更新;
  2. 如果不可用,您可以在单独的并发运行的更新会话中手动拆分工作。这将要求您能够有效地分割工作,最好是使用分区。
  3. 关闭所有开销:禁用/删除索引,关闭允许时间点恢复的事务日志记录等。在您的情况下,索引不会因为您没有更新索引列而受到损害,或者添加新行。

    理论上使用16核系统(x2用于CPU架构上的超线程)。如果你没有其他瓶颈(磁盘io),50分钟的工作将在3分钟内完成。