文章目錄
說真的剛開始真不知道這有什麼差,不都是索引嗎,後來說了點時間看了MSDN才瞭解,先用我自己的意思解釋,在附上原文。
Clustered : 資料與索引是儲放在一起,每個表格中只能有一個,資料必會排序過,速度快。
NonClustered:資料與索引為分開儲放,就像C++的指標,索引會存儲資料的位置,資料可能沒有排序。
叢集索引結構
在 SQL Server 中,索引的結構為 B 型樹狀目錄。索引 B 型樹狀目錄中的每個分頁稱為索引節點。B 型樹狀目錄的頂部節點稱為根節點。索引中的底層節點稱為分葉節點。根與分葉節點之間的任何索引層級通稱為中繼層級。在叢集索引中,分葉節點包含基礎資料表的資料頁。根和中繼層級節點包含儲存索引資料列的索引頁。每個索引資料列都包含索引鍵值,以及指向 B 型樹狀目錄之中繼層級分頁或索引分葉層級之資料列的指標。索引每個層級中的分頁都以雙向連結串列方式連結。
非叢集索引結構
非叢集索引擁有與叢集索引相同的 B 型樹狀目錄結構,不過有下列顯著的差異:
- 基礎資料表的資料列並未根據其非叢集索引鍵的順序,進行排序與儲存。
- 非叢集索引的分葉層是由索引頁 (而不是資料頁) 所組成。
非叢集索引可定義於具有叢集索引或堆積的資料表或檢視中。非叢集索引中的每個索引資料列,都包含非叢集索引鍵值和資料列定位器。這個定位器指向叢集索引或堆積中,擁有此索引鍵值的資料列。
非叢集索引資料列中的資料列定位器是資料列的指標,或資料列的叢集索引鍵,如下所述:
- 如果資料表為堆積 (表示沒有叢集索引),則資料列定位器為資料列的指標。該指標將以檔案識別碼 (識別碼)、頁碼與分頁中的資料列編號來建立。整個指標也稱為資料列識別碼 (RID)。
- 如果資料表有叢集索引,或索引位於索引檢視中,則資料列定位器為資料列的叢集索引鍵。如果叢集索引並非唯一的索引,SQL Server 2005 會加入稱為 uniqueifier 之內部產生的值,讓任何重複的索引鍵變成唯一的索引鍵。使用者看不到這個四位元組的值。只有在必須讓叢集索引鍵變成唯一的索引鍵以便在非叢集索引使用時,才會加入此值。SQL Server 藉由使用非叢集索引之分葉資料列所儲存的叢集索引鍵來搜尋叢集索引,以便擷取資料列。
資料來源
資料表與索引架構
用索引提高SQL Server效能