当我在SQL 2005中删除一个聚集主键时会发生什么?

4

我有一个PK约束,即两个列上的聚集索引,我正在删除它。该命令运行了一个小时仍未完成。我本以为只是删除一个约束,操作应该几乎瞬间就完成了。

有人能解释一下当我删除PK时,在幕后实际发生了什么吗?

3个回答

9

聚集索引不仅仅是“约束条件”,它还是一种存储方法。

当您删除它时,您的数据将从聚集存储重新排序到堆存储中。

其他索引将被更新以引用 RID 而不是 PRIMARY KEY 值。


1

聚集索引就是数据,这也解释了运行所需的时间。


请问您能否详细说明一下?删除聚集索引pk约束并不会删除数据本身(至少如果它这样做,我会遇到麻烦)。您的意思是数据正在被重新排序吗? - Mr. Flibble
聚集索引决定了数据的物理排列方式。当您删除它时,数据将被重新排列 - 但不会被删除,不用担心。 - Otávio Décio
1
好的。那么为什么要重新排列呢?如果我没有指定顺序,它为什么要费心去制定自己的顺序呢? - Mr. Flibble
默认情况下是按顺序添加的。SQL Server选择默认聚集PK,因为3在2之后,而2在1之后。当您插入新行时,很容易按顺序编写它。例如,如果您聚集了UNIQUEID,则每次插入都可能会重新格式化硬盘 :) - Timothy Khouri
我马上会发布一个新问题,关于如何做到这一点,并在这里添加一个链接。 - Mr. Flibble
显示剩余4条评论

0
一个“聚集”索引将会在硬盘上物理地按顺序写入您的表记录。因此,删除或更改该索引可能会导致SQL Server基本上对您的硬盘进行“碎片整理”(重新排序)(至少是该表数据所在的部分)。
请注意,这个答案并不完全技术化……但它旨在给你一个“哦,那就是正在发生的事情”的答案,通常已经足够了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接