在SQL 2005中更改聚簇索引(PK)的最佳方法

Mr.*_*ble 6 sql indexing sql-server-2005 primary-key clustered-index

我有一个表在两列上有一个聚簇索引 - 表的主键.它的定义如下:

ALTER TABLE Table ADD  CONSTRAINT [PK_Table] PRIMARY KEY CLUSTERED 
(
  [ColA] ASC,
  [ColB] ASC
)WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

我想删除此聚簇索引PK并添加如下所示的聚簇索引,并使用非聚集索引添加主键约束,如下所示.

CREATE CLUSTERED INDEX [IX_Clustered] ON [Table] 
(
  [ColC] ASC,
  [ColA] ASC,
  [ColD] ASC,
  [ColE] ASC,
  [ColF] ASC,
  [ColG] ASC
)WITH (PAD_INDEX  = ON, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF,     DROP_EXISTING = OFF, IGNORE_DUP_KEY = OFF, FILLFACTOR = 90, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = OFF) ON [PRIMARY]

ALTER TABLE Table ADD CONSTRAINT
  PK_Table PRIMARY KEY NONCLUSTERED 
  (
    ColA,
    ColB
  ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

我打算只下降的PK聚集索引,然后添加新的聚集索引,然后添加非聚集主键索引,但我了解到,丢弃现有的聚集索引将导致重新排序表中的数据(见回答这里什么当我在SQL 2005中删除聚簇主键时发生这种情况,我认为不应该这样做.该表敲了1 TB,所以我真的想避免任何不必要的重新排序.

我的问题是,从现有结构到所需结构的最佳方法是什么?

编辑:只想澄清一下.该表是1TB,遗憾的是我没有空间来创建临时表.如果有办法在没有创建临时表的情况下执行此操作,请告诉我.

Tom*_*m H 11

这不是对您的问题的完整答案,但请确保如果您在表格上有任何其他索引,那么您首先删除它们.否则,当您删除聚簇索引时,SQL Server将不得不重新构建它们,然后在添加新的聚簇索引时再次重建它们.通常的步骤是:

  1. 删除所有非聚集索引
  2. 删除聚集索引
  3. 添加新的聚簇索引
  4. 添加所有非聚集索引


mar*_*c_s 8

如果你的表大小达到1 TB并且可能有很多行,我强烈建议不要使聚簇索引更胖!

首先,删除并重新创建聚簇索引将至少对您的所有数据进行一次洗牌 - 仅此一项将需要很长时间.

其次,您尝试创建的大型复合聚簇索引将显着增加所有非聚集索引的大小(因为它们包含每个叶节点上的整个聚簇索引值,用于书签查找).

问题是更多:你为什么要这样做?难道你不能只用这些列添加另一个非聚集索引来覆盖你的查询吗?为什么这必须是聚集索引?我认为没有任何优势....

有关索引,尤其是聚簇索引争论的更多信息,请参阅Kimberly Tripp关于SQL Server索引的博客 - 非常有帮助!