2017-08-01 298 views
0

我知道表中的唯一一個聚集索引定義了行的物理排序方式,例如,在表中爲什麼主鍵應該是聚簇索引?

================================== 
      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))

那麼,爲什麼我們希望主鍵定義行的物理順序呢?

+4

您並不總是希望聚簇索引是主鍵。這不是必需的,只有默認情況下,幾乎總是最主要的關鍵也是聚集索引。 –

+2

我不確定在第一個示例或一般情況下,聚簇索引查找本身是「O(1)」。聚集索引只意味着一旦在索引中找到該項目,實際項目就在那裏。在非聚集索引中,即使找到該項目,我們仍然需要在聚簇索引中進行查找以查找實際記錄(如果我的術語稍微偏離,請原諒我)。 –

+0

不知道爲什麼這會得到downvoted或標記爲不清楚。這是一個有效的問題,我很清楚OP在問什麼。答案很長,因爲它需要很多關於索引的信息,但問題本身對我來說似乎很合理。也許它之前已經被問過,但不值得讚揚。 –

回答

2

SQL Server中聚簇索引的重要性不是「物理排序」,而是行數據在B樹的葉頁中可用,因此避免了額外的查找。子樹成本與非聚簇B樹索引相同:O(log n)。

物理排序實際上是聚集索引內實際發生的內容的抽象。 extents內的頁面存儲在分配順序中,不一定按聚簇索引鍵排序。索引鍵排序保持在索引分配映射表和指針鏈中,由此每個頁面指向下一個(不一定相鄰)頁面。在頁面內,行也按分配順序寫入和存儲,而不是按鍵順序,並且除非頁面分割,否則順序不會改變。當重建索引時,頁面本身會使用,但重建之間不會自動維護順序。

主鍵不一定是聚簇索引的最佳選擇。這兩個概念彼此正交。

相關問題