[英]Should primary key clustered index columns added to the non clustered indexes?
[英]Why are primary keys supposed to be clustered indexes?
我知道,一个表上只有一个聚簇索引定义了行的物理排序方式,例如在表中
==================================
Contacts
==================================
ID (P.K.) | FirstName | LastName
==================================
1 | 'Donald' | 'Trump'
----------------------------------
2 | 'Crooked' | 'Hillary'
----------------------------------
3 | 'Crazy' | 'Bernie'
这意味着3条记录将按照上面显示的顺序进行物理存储。 但是我不明白为什么这有帮助。 像上面的示例一样,也许在没有间隙的自动递增主键的情况下,这有助于查询
SELECT FirstName+LastName FROM Contacts WHERE ID=2
因为如果ID=2
在O(1)
时间内发生,则物理排序使查找成为可能(例如,通过索引获取数组的元素)。 但是如果桌子像
==================================
Contacts
==================================
ID (P.K.) | FirstName | LastName
==================================
1 | 'Donald' | 'Trump'
----------------------------------
89 | 'Crooked' | 'Hillary'
----------------------------------
12309 | 'Crazy' | 'Bernie'
则物理顺序不允许进行 O(1)
查找; 我们能做的最好的就是O(log(n))
。
那么,为什么我们要主键定义行的物理顺序?
SQL Server中的聚集索引的重要性不是“物理顺序”,而是B树的叶子页中有行数据的事实,从而避免了额外的查找。 子树成本与非聚集B树索引相同:O(log n)。
物理排序实际上是对聚集索引内部实际发生情况的抽象。 扩展数据块内的页面按分配顺序存储,而不必按聚簇索引键排序。 索引键排序在索引分配映射表和指针链中维护,由此每个页面都指向下一个(不一定是相邻的)页面。 在页面内,行也按照分配顺序(而不是键顺序)写入和存储,除非页面拆分,否则顺序不会改变。 重建索引时,页面本身将重新使用,但重建之间的顺序不会自动保持。
对于聚集索引,主键不一定是最佳选择。 这两个概念相互正交。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.