我想在已经包含数十亿行的表中添加一个新列。新列派生自现有列。
例如,
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 *,它会产生一个巨大的结果集(考虑数十亿条记录)。
有没有更好的方法呢?
答案 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秒运行一次。