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

时间:2010-07-19 09:19:56

标签: sql database

我想在已经包含数十亿行的表中添加一个新列。新列派生自现有列。

例如,

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 *,它会产生一个巨大的结果集(考虑数十亿条记录)。

有没有更好的方法呢?

3 个答案:

答案 0 :(得分:2)

不同的DBMS具有不同的SQL方言,指定您在问题中使用的方法很有用。

在SQL Server中,您可以使用Computed Column但这会在每次选择数据时计算结果,您可以将其标记为持久但可能需要一段时间才能进行更改。但如果您要删除旧列,则无法执行此操作。

或者创建允许空值的新列,然后批量更新

UPDATE TOP (1000) table_name SET new_col1 = old_col1 + col_col2 WHERE new_col1 IS NULL

此查询再次针对SQL Server,但您的DBMS还有其他选择。

另请阅读Hoopers先生关于为新列添加索引的评论,以确保UPDATE的性能不会因为添加更多数据而变得更糟。更新是一个读写操作,索引将加速读取并略微延迟写入(维护索引),但它应该是值得的。

答案 1 :(得分:1)

如果您还在其中一个新列上添加了索引,我认为Diver先生的方法会很好;否则,随着工作的进展,它将不得不进行越来越多的扫描,以找到尚未更新的行。添加索引意味着它不必这样做。一个可能的缺点是,在创建列时,索引差异将是可怕的,但我不认为这将是一个问题,因为您只关心NULL或NOT NULL。您可以在更新完成后删除索引。

答案 2 :(得分:0)

使用存储过程,按其中的100个进行更新,将存储过程添加为作业,每隔30秒运行一次。