Sql server 删除聚集索引创建聚集索引

Sql server 删除聚集索引创建聚集索引,sql-server,indexing,clustered-index,Sql Server,Indexing,Clustered Index,我有一个99mm+行800GB的表(和其他类似大小的表)。我想删除现有的聚集PK(重新创建为非聚集PK)并创建一个新的聚集索引。这是用于性能调整的。 在阅读了性能调优/索引之后,我得出结论,在日期、Id(标识)列上重新创建聚集索引可能是最好的选择。它将以逻辑方式重新组织表,减少读取和IOs ALTER TABLE [dbo].[Adventure_works] DROP CONSTRAINT [PK_ADV] GO ALTER TABLE [dbo].[Adventure_works] ADD

我有一个99mm+行800GB的表(和其他类似大小的表)。我想删除现有的聚集PK(重新创建为非聚集PK)并创建一个新的聚集索引。这是用于性能调整的。 在阅读了性能调优/索引之后,我得出结论,在日期、Id(标识)列上重新创建聚集索引可能是最好的选择。它将以逻辑方式重新组织表,减少读取和IOs

ALTER TABLE [dbo].[Adventure_works] DROP CONSTRAINT [PK_ADV]
GO

ALTER TABLE [dbo].[Adventure_works] ADD  CONSTRAINT [PK_ADV] PRIMARY KEY NONCLUSTERED 
(
[id] ASC,
[leg_id] ASC,
[category] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO

CREATE CLUSTERED INDEX [IX_Adv_date_id] ON dbo.[Adventure_works](
[biz_date] asc,
[id] asc
)
在执行上述步骤之前,我还将删除所有其他非聚集索引(NCI),因为这样可以避免在删除/创建CI期间重建NCI。 然而,完成操作仍需1.5小时


是否有更快的方法来实现这一点?

否。删除聚集索引会将表变成一个堆,重新创建它会将其转换回聚集表-因此整个数据将被复制大约两次-这只需要花费时间,并没有捷径或神奇的WOKAROUND可以避免这种情况。创建一个具有所需聚集索引的新表,并对其进行大容量插入。然后添加NCI并重命名表。假设您有一个窗口,在该窗口中,您可以在没有并发活动的情况下执行此维护。1.5小时一次是不需要优化的。“你不是一直在重新组织你的数据库,是吗?”MartinSmith,谢谢。我试试看。@marc_删除聚集索引不会将数据复制到堆中。它会删除非叶BTree页面,使叶页面在适当的位置成为一堆。看见