一张表中可以有多少个聚集索引?

29

在 SQL Server 2008 中,一张表可以有多少个聚集索引?

5个回答

43

19

一、正如这里所述:

“聚集索引确定表中数据的物理顺序。聚集索引类似于电话簿,按照姓氏排列数据。由于聚集索引决定了表中数据的物理存储顺序,因此一个表只能包含一个聚集索引。”


7

针对 SQL Server 2005: 1 个聚集索引 + 249 个非聚集索引 = 250 个索引

针对 SQL Server 2008: 1 个聚集索引 + 999 个非聚集索引 = 1000 个索引


1

1.

虽然有一些原因,但只允许一个聚集索引似乎有点奇怪。聚集索引内部排序并不能真正解释为什么只有一个这样的索引,因为非聚集索引与聚集索引完全相同。非聚集索引可以像聚集索引一样包含表中的所有数据。因此,在某些情况下,创建多个“聚集”索引或干脆取消区分可能是相当合理的。但是SQL Server不允许您创建多个。


2
这不是我的理解。根据Joe的链接,聚集索引是关于实际存储顺序的。认为你可以以两种不同的顺序平等地排列数据是没有意义的...相反,你会先按一种顺序排序,然后再按另一种顺序排序...因此有了聚集索引。编辑:虽然我认为给你投票反对的人有点过分了。 - Matthew
1
@Matthew:认为同一数据按不同顺序排序是“荒谬的”并不正确。如果您在相同列集上创建两个非聚集索引,甚至使用INCLUDE子句在非聚集索引中包含额外列,那么这正是发生的情况。我也想知道为什么我被踩了。 - nvogel
不,两个非聚集索引创建了“映射”,以便快速定位物理存储上的数据元素...它们不会改变位的分配位置。将其与文件柜中的实体文件相关联...您可能会有一个树状系统来快速定位任何文件,但文件仍然只按单个实体顺序存储。这就像非连续 GUID 会降低 INSERT 性能的原因一样...每个随机 GUID 都会强制对所有记录进行重新排序。 - Matthew
非聚集索引的排序方式与聚集索引完全相同 - 它是索引页面的双向链表。它们被重新排序的方式也完全一样。非聚集索引包含聚集键这一事实是主要区别,但这并不是非常重要的区别,因为非聚集索引可以轻松地包含与聚集索引相同的数据。 - nvogel
1
不按照Microsoft,而是按照Joe Stefanelli的链接。很明显,“聚集索引决定表中数据的物理顺序。”从逻辑上讲,物理数据只能存在于一个顺序中。如果您愿意,可以保留多个物理副本,并根据某些其他索引决定要查询哪个...但这超出了本问题的范围。 - Matthew
2
表格的页面如果存在聚集键,则按照聚集键的顺序在磁盘上物理存储。我不确定为什么会有任何混淆或怀疑。 - JNK

0

在 SQL Server 中只有一个。DB2 提供了更多的可能性,但代价是:二维聚集需要大量的内存(与行数的平方成比例)。


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