簡體   English   中英

為什么主鍵應該是聚簇索引?

[英]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=2O(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM