将聚集主键转换为非聚集主键并使用另一列作为聚集索引

Ric*_*ich 6 index sql-server-2008 database-design sql-server clustered-index

我有一个带有主键 (GUID) 的大表,它也是聚集索引。已经有一个基于整数序列的字段。所以我想保留 GUID 作为 PK 并使整数列成为聚集索引。

除了删除原始约束并创建新的 PK 和新的聚集索引之外,我想不出任何方法来做到这一点。但这需要很长时间,从我收集的内容来看,重建表两次,一次是从聚集索引转到堆,然后堆回到聚集索引。

我无法进行表重建(创建新的、迁移数据、交换名称),因为我不能中断。

有任何想法吗?

版本:SQL Server 2008 Service Pack 2,开发人员/企业。

Aar*_*and 10

我不认为您可以在线执行此操作,因为您不能只是将聚集索引从一列移动到另一列,并且您不能使用它DROP_EXISTING来减少必须完成的工作量。

但是,如果您愿意执行工作,则可以避免中断。

  1. 使用新结构创建一个新表
  2. 重命名原始表,并使用原始名称创建一个视图 - 该视图将是新旧表的联合 - 性能不会很好,但不会脱机
  3. 在视图上创建 INSTEAD OF 触发器以将 DML 应用于旧表或新表
    • 插入应该只是去新表
    • 更新应该同时尝试
    • 删除应该同时尝试
  4. 将行以块的形式从旧表复制到新表。将需要 SET IDENTITY_INSERT ON 并且您应该在其自己的事务中执行每个“块”。
  5. 一旦旧表不包含新表中不存在的行,在单个事务中:
    • 放下旧桌子
    • 放下视图
    • 重命名新表