1

我正在更新包含数百万(8500 万)行的表中的 2 列。现在要更新这些,我正在使用更新命令,例如,

UPDATE Table1

  SET Table1.column1 = Table2.column1 ,
      Table1.column2 = Table2.column2 

FROM 
      Tables and with a Join-conditions;

现在我的问题是,这需要 23 小时。即使在使用批量大小之后,所花费的时间也没有太大变化。

但我需要在不到 5 小时内更新它。那可能吗。我应该采取什么方法来实现它?

4

2 回答 2

4

SQL 更新语句必须保留日志文件中的所有行,以便它可以在失败时回滚。正如这个家伙所解释的,处理数百万行的最佳方法是忘记原子性并将更新批处理成 50,000 行(或其他):

--Declare variable for row count
Declare @rc int
Set @rc=50000

While @rc=50000
 Begin

  Begin Transaction

  --Use Top (50000) to limit number of updates
  --performed in each batch to 50K rows.
  --Use tablockx and holdlock to obtain and hold 
  --an immediate exclusive table lock. This unusually
  --speeds the update because only one lock is needed.
  Update Top (50000) MyTable With (tablockx, holdlock)
    Set UpdFlag = 0
  From MyTable mt
  Join ControlTable ct
    On mt.KeyCol=ct.PK
  --Add criteria to avoid updating rows that
  --were updated in previous pass
  Where m.UpdFlag <> 0

  --Get number of rows updated
  --Process will continue until less than 50000
  Select @rc=@@rowcount

  --Commit the transaction
  Commit
 End

这仍然存在一些问题,因为您需要知道您已经处理了哪些行,也许比这个人(和我!)更聪明的人可以用更多的 MSSQL 魔法来计算出更好的东西;但这应该是一个开始。

于 2012-04-12T05:55:00.990 回答
0

我已经使用 SSIS 来完成这项任务。

首先,我获取了必须更新 2 列的源表。然后,我执行了查找任务,其中我必须将源列映射到目标表列,我必须从中获取数据以更新源表列。最后添加了 OLEDB 目标,我将根据查找中的连接条件填充表格。

这个过程真的比执行更新脚本快。

于 2012-04-17T05:14:15.580 回答