具有单个值的大表的UPDATE列

时间:2015-08-04 12:06:49

标签: sql-server sql-server-2008 tsql ssis sql-update

我有一张 20亿行的表格。 恢复模式很简单。

我有一个简单的任务要做:

class Foo
{
public:
    void SetMember(int n) {  AcquireMutex(..); n_ = n; ReleaseMutex(...);}
private:
   Thread()
   {
      while(1)
      {
         AcquireMutex(..);
         // Do something with n_
         ReleaseMutex(...);
       }
   }
};

这个任务起初看起来很简单,但在我读到的任何地方,最好将SELECT INTO放到另一个表中,或者进行批量更新。

批量更新是否必要?上面的查询是否会破坏事务日志?

如果我创建另一张桌子,我肯定会用完空间。

任何帮助将不胜感激。

编辑:我没有主键。此外,没有索引,没有约束,任何东西。

也许这会有所帮助?

Commit failed with error:
pathspec 'f/Workspaces/AndroidStudio/ProjectName/app/src/main/java/com/ project/Utilities/PixelConverter.java' did not match any file(s) known to git.

4 个答案:

答案 0 :(得分:1)

这是一种非常狂野的non-sql方式,但您可以使用ETL工具(例如SSIS)来避免在很大程度上进行日志记录。

免责声明:这可能是一个耗时的步骤,可能会占用您服务器上的文件空间。

有两个数据流任务(DFT1,DFT2)。

<强> DFT1

enter image description here

使用派生列转换,传递值“A”而不是实际值columnA

平面文件现在将具有必需的数据。下一步是将其导入表格。

在DFT 之外,现在截断此表。您可能知道TRUNCATE是未记录的操作。因此,不会触及您的交易日志。

最后,

<强> DFT2

从平面文件将数据导入tableA。

enter image description here

SSIS内部执行最小的日志记录,因此trasaction日志不会受到太多打扰。

另外,我刚看到你在你的问题中添加了ssis标签,所以这个答案应该是有效的。

答案 1 :(得分:0)

分批运行

 Declare @pk integer = 0
 declare @max integer
 select @max = Max(primKeyCol) from myTable
 While @pk < @Max Begin
      Update myTable set columnA = 'X'
      Where primKeyCol Between @pk and @pk + 999
      Set @pk += 1000
 End

答案 2 :(得分:0)

我建议您使用批量更新,因为大表中的这种UPDATE会导致大量锁定。 我找到了批次here

的一个很好的例子

答案 3 :(得分:0)

尝试一次更新50.000行

DECLARE @chk INT = 1
WHILE @chk > 0
BEGIN
  ;WITH CTE as
  (
    SELECT TOP 50000 columnA
    FROM myTable
    -- the reason for this check is to check for NULLS in columnA
    -- otherwise it could just be columnA <> 'X'
    WHERE exists(SELECT columnA EXCEPT SELECT 'X')
  )
  UPDATE CTE SET columnA = 'X'
  SET @chk = @@rowcount
  WAITFOR DELAY '00:00:30' -- 30 seconds, may need to change it
END

来自microsoft Link

  

使用SET ROWCOUNT不会影响DELETE,INSERT和UPDATE   SQL Server未来版本中的语句。避免使用SET ROWCOUNT   在新的开发工作中使用DELETE,INSERT和UPDATE语句,   并计划修改当前使用它的应用程序。对于类似的   行为,使用TOP语法。有关更多信息,请参阅TOP   (处理SQL)。