我有一个非常大的表(8800 万行,大小接近 300GB),它的聚簇索引计划不周。我想添加一个BIGINT
标识字段,并使其成为新的聚集索引(具有唯一、窄、静态和不断增加的理想属性)。
问题是我还希望这个新的身份字段在当前记录上以某种方式排序(基于不是当前集群的现有日期字段)。因此,当我们清除最旧的记录时,它们在磁盘上都是连续的。(不过,日期字段不是唯一的,因此它本身并不是集群的良好候选者。)
我怎样才能按照我想要的方式获得这个新身份字段的值?
我的第一个想法是创建一个带有标识字段的新表,并且只INSERT INTO
将当前表ORDER BY
中的行作为日期字段?那行得通吗?
如果我没有足够的磁盘空间来执行此操作,是否有任何方法可以“就地”执行此操作?也许通过将聚集索引更改为日期字段(等待很长时间),然后添加身份(再次等待很长时间)?身份的值是否保证由当前集群排序?
我刚刚在 SQL Server 2012 box 上进行了以下实验:
结果:
下一个:
结果:
并且,再进行一次测试:
结果:
我想这并不能保证聚簇索引决定了新 IDENTITY 列的填充顺序——但是,我想说这强烈表明它很有可能。