sql-server - 具有单个值的大表的 UPDATE 列

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

我有一个包含 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

enter image description here

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

平面文件现在将包含必要的数据。下一步是将其导入表中。

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

最后,

DFT2

将数据从平面文件导入到表A。

enter image description here

SSIS 在内部进行最少的日志记录,因此交易日志不会受到太多干扰。

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

关于sql-server - 具有单个值的大表的 UPDATE 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31808926/

相关文章:

mysql - SQL - 查询 session 室

sql-server-2008 - 在sql server中选择不排序的记录

sql-server - Management Studio 中缺少集成服务目录

c# - 无法将 NULL 值插入到列、表中;列不允许为空...但是该列是主键并且具有自动增量属性

sql - 获取 SSMS 中彼此相反的两列的区别

sql-server - 如何在 SQL 中获取月份的 3 个字母缩写

sql - 加入具有多个匹配项的表,但只带回指定的匹配项

SQL 将变量设置为当前行中的值

SQL Server : Insert INTO Statement syntax

sql - 查询显示表之间不匹配的记录