将新列添加到具有数十亿行的列数据库中

我想在一个已经包含数十亿行的表中添加一个新列。新列派生自现有列。 例如,
new_col1 = old_col1 + old_col2
new_col2 = old_col1 / old_col2
我试图通过以下方式做到这一点 - 添加新列
ALTER TABLE table_name
ADD (   column_1    column-definition,
column_2    column-definition,
... 
column_n    column_definition )
从表中逐个读取行并填充新列的值。 数据库中没有主键。所以我不能提到一个单独的行。要逐个读取行,我必须执行select *,它会产生一个巨大的结果集(考虑数十亿条记录)。 有没有更好的方法来做到这一点?     
已邀请:
不同的DBMS具有不同的SQL方言,指定您在问题中使用的方法很有用。 在SQL Server中,您可以使用计算列,但这会在每次选择数据时计算结果,您可以将其标记为持久但可能需要一段时间才能进行更改。但是,如果要删除旧列,则无法执行此操作。 或者,创建允许空值的新列,然后批量更新它
UPDATE TOP (1000) table_name SET new_col1 = old_col1 + col_col2 WHERE new_col1 IS NULL
同样,查询是针对SQL Server的,但是您的DBMS还有其他选择。 另请阅读Hoopers先生关于在新专栏中添加索引的评论,以确保随着更多数据的添加,
UPDATE
的性能不会变差。更新是一个读写操作,索引将加快读取并略微延迟写入(维护索引),但它应该是值得的。     
我认为如果你还在一个新专栏上添加索引,Diver先生的方法会没问题。否则,随着工作的进展,它将不得不进行越来越多的扫描,以找到尚未更新的行。添加索引意味着它不必这样做。一个可能的缺点是,在创建列时,索引差异将是可怕的,但我不认为这将是一个问题,因为您只关心NULL或NOT NULL。您可以在更新完成时删除索引。     
使用存储过程,由100个进行更新,将存储过程添加为作业,每30秒运行一次。     

要回复问题请先登录注册