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 TB并且可能有很多行,我强烈建议不要使聚簇索引更胖!
首先,删除并重新创建聚簇索引将至少对您的所有数据进行一次洗牌 - 仅此一项将需要很长时间.
其次,您尝试创建的大型复合聚簇索引将显着增加所有非聚集索引的大小(因为它们包含每个叶节点上的整个聚簇索引值,用于书签查找).
问题是更多:你为什么要这样做?难道你不能只用这些列添加另一个非聚集索引来覆盖你的查询吗?为什么这必须是聚集索引?我认为没有任何优势....
有关索引,尤其是聚簇索引争论的更多信息,请参阅Kimberly Tripp关于SQL Server索引的博客 - 非常有帮助!
渣