我有一个包含 20 亿 行的表。 恢复模式很简单。
我有一个简单的任务要做:
UPDATE myTable SET columnA = 'X'
这个任务一开始看起来很简单,但我到处都读到,最好对另一个表进行 SELECT INTO,或者进行批量更新。
是否需要批量更新?上面的查询会破坏事务日志吗?
如果我创建另一个表,我肯定会用完空间。
任何帮助将不胜感激。
编辑:我没有主键。此外,没有索引,没有约束,任何东西。
也许这会有所帮助?
SET rowcount 10000
Update myTable
set columnA ='X'
where columnA <> 'X'
while @@rowcount>0
BEGIN
SET rowcount 10000
Update myTable
set columnA ='X'
where columnA <> 'X'
end
SET rowcount 0
最佳答案
这是一种非常疯狂的非 sql
方式,但您可以使用 ETL
工具(例如 SSIS
)来避免登录到很大程度。
免责声明:这可能是一个耗时的步骤,并且可能会占用您服务器上的文件空间。
有两个数据流任务(DFT1,DFT2)。
DFT1
使用派生列转换,传递值“A”而不是 columnA
的实际值。
平面文件现在将包含必要的数据。下一步是将其导入表中。
在 DFT 之外,现在截断此表。 TRUNCATE
你可能知道是非日志操作。因此您的交易日志不会被触及。
最后,
DFT2
将数据从平面文件导入到表A。
SSIS
在内部进行最少的日志记录,因此交易日志不会受到太多干扰。
另外,我刚刚看到你在你的问题中添加了 ssis 标签,所以这个答案应该是有效的。
关于sql-server - 具有单个值的大表的 UPDATE 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31808926/