添加并填充一列或添加一个持久化计算列?

4

我有一个包含1000万行、5GB数据的数据库表,没有主键,但有一个聚集索引。每天都会添加数十万条记录。我想要添加一个新列:

 ALTER TABLE dbo.CMS_hsplit ADD
     split_locIDacd  AS CONVERT(varchar(8), split) + '-' + 
     CONVERT(varchar(8), CASE WHEN loc_id = 105 THEN acd ELSE loc_id END) PERSISTED

这位数据库管理员更倾向于改变加载表的ETL过程。我知道持久化的计算字段需要一些时间来回填数据。使用计算字段是否真的存在显著的开销?

更新

预计计算字段数年内不会更改

如果定义确实更改了,那么它必须是追溯性的。

1个回答

7

我认为添加列或填充列的开销并不是重点。更重要的问题是,你计算列的定义是否对表中每一行在数据库的生命周期中始终有效?如果你需要更改定义,或者在某个日期之后添加新的行应该具有不同的定义而旧的行应该保持当前的定义,则计算列要么不可行,要么完全不可能。

我的偏好是添加一个普通列,并将填充它的业务规则添加到你的ETL过程中。这也确保了所有的业务规则都在一个地方(你的ETL代码),而不是在代码和模式之间分散。


5
同意。但计算列和手动列(假设定义是永久的)之间的一个重要区别是,现有的1000万行可以分批手动填充,而不是全部填充,这在锁定、事务日志开销等方面可能更加高效。 - Aaron Bertrand

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接