小编典典

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

sql

我有一个表,该表在两列上都有聚集索引-该表的主键。它的定义如下:

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]

我想删除此聚簇索引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]

我打算只下降的PK聚集索引,然后添加新的聚集索引,然后添加非聚集主键索引,但我了解到,丢弃现有的聚集索引将导致表数据重新排序认为这不是必需的。桌子敲了1
TB,所以我真的想避免任何不必要的重新排序。

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

编辑:只想澄清一下。该表为1TB,很遗憾,我没有空间来创建临时表。如果有没有创建临时表的方法,请告诉我。


阅读 197

收藏
2021-03-23

共1个答案

小编典典

如果您的表的大小已达到1 TB,并且其中可能有很多行,那么我强烈建议不要使聚集索引更胖!

首先,删除并重新创建聚簇索引将使您的所有数据至少随机洗一次-仅此一项将花费很多时间。

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

问题更多:您为什么要尝试这样做?您是否不能仅在这些列中添加另一个非聚集索引来潜在地覆盖您的查询?为什么这必须是聚簇索引?我认为这没有任何优势。

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

马克

2021-03-23