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

Jam*_*ler 4 sql-server etl sql-server-2008

我有一个包含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
Run Code Online (Sandbox Code Playgroud)

分配给此的DBA更喜欢更改加载表的ETL过程.我知道持久计算字段需要一些时间来回填数据.使用计算字段真的有很大的开销吗?

UPDATE

计算字段预计不会改变多年

如果定义确实发生变化,则必须具有追溯力

Pon*_*ife 7

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

我的偏好是添加一个普通列并添加业务规则以将其填充到您的ETL过程中.这也确保您的所有业务规则都在一个地方(您的ETL代码),而不是在代码和架构之间分开.

  • 同意.但是计算列和手动之间的一个重要区别(假设定义是永久性的)是现有的1000万行可以批量手动填充而不是批量,这在锁定,事务日志开销等方面可以更有效. (4认同)