索引是按b樹結構進行組織的。索引b樹中的每一頁稱為乙個索引節點。b樹的頂端節點稱為根節點。索引中的底層節點稱為葉節點。根節點與葉節點之間的任何索引級別稱為中間級。在聚集索引中,葉節點包含基礎表的基礎頁。根節點和中間級節點包含存有索引行的索引頁。每個索引行包含乙個鍵值和乙個指標,該指標指向
b樹上的某一中間級頁或者葉級索引中的某個資料行。每個索引中的頁均被鏈結再雙向鏈結列表中。
聚集索引在sys.partitions 中有一行,其中,索引使用的每個分割槽的index_id= 1。預設情況下,聚集索引有單個分割槽。當聚集索引有多個分割槽時,每個分割槽都有乙個包含該特定分割槽相關資料的 b 樹結構。例如,如果聚集索引有四個分割槽,就有四個 b 樹結構,每個分割槽中有乙個 b 樹結構。
根據聚集索引中的資料型別,每個聚集索引結構將有乙個或多個分配單元,將在這些單元中儲存和管理特定分割槽的相關資料。每個聚集索引的每個分割槽中至少有乙個 in_row_data 分配單元。如果聚集索引包含大型物件 (lob) 列,則它的每個分割槽中還會有乙個 lob_data 分配單元。如果聚集索引包含的變數長度列超過 8,060 位元組的行大小限制,則它的每個分割槽中還會有乙個 row_overflow_data 分配單元。有關分配單元的詳細資訊,請參閱表組織和索引組織。
資料鏈內的頁和行將按聚集索引鍵值進行排序。
所有插入操作都在所插入行中的鍵值與現有行中的排序順序相匹配時執行。b 樹頁集合由sys.system_internals_allocation_units系統檢視中的頁指標來定位。
sys.system_internals_allocation_units系統檢視保留為僅供 microsoft sql server 內部使用。不保證將來的相容性。
對於某個聚集索引,sys.system_internals_allocation_units中的root_page列指向該聚集索引某個特定分割槽的頂部。sql server 將在索引中向下移動以查詢與某個聚集索引鍵對應的行。為了查詢鍵的範圍,sql server 將在索引中移動以查詢該範圍的起始鍵值,然後用向前或向後指標在資料頁中進行掃瞄。為了查詢資料頁鏈的首頁,sql server 將從索引的根節點沿最左邊的指標進行掃瞄。
下圖顯式了聚集索引單個分割槽中的結構。
非聚集索引與聚集索引具有相同的 b 樹結構,它們之間的顯著差別在於以下兩點:
·
基礎表的資料行不按非聚集鍵的順序排序和儲存。
·
非聚集索引的葉層是由索引頁而不是由資料頁組成。
既可以使用聚集索引來為表或檢視定義非聚集索引,也可以根據堆來定義非聚集索引。非聚集索引中的每
個索引行都包含非聚集鍵值和行定位符
。此定位符指向聚集索引或堆中包含該鍵值的資料行。
非聚集索引行中的行定位器或是指向行的指標,或是行的聚集索引鍵,如下所述:
·
如果表是堆(意味著該錶沒有聚集索引),則行定位器是指向行的指標。該指標由
檔案識別符號 (id)、頁碼和頁上的行數生成。整個指標稱為行 id (rid)。
·
如果表有聚集索引或索引檢視上有聚集索引,則行定位器是行的聚集索引鍵。如果聚集索引不是唯一的索引,sql server 將新增在內部生成的值(稱為唯一值)以使所有重複鍵唯一。此四位元組的值對於使用者不可見。僅當需要使聚集鍵唯一以用於非聚集索引中時,才新增該值。sql server 通過使用儲存在非聚集索引的葉行內的聚集索引鍵搜尋聚集索引來檢索資料行。
對於索引使用的每個分割槽,非聚集索引在index_id>0 的sys.partitions 中都有對應的一行。預設情況下,乙個非聚集索引有單個分割槽。如果乙個非聚集索引有多個分割槽,則每個分割槽都有乙個包含該特定分割槽的索引行的 b 樹結構。例如,如果乙個非聚集索引有四個分割槽,那麼就有四個 b 樹結構,每個分割槽中乙個。
根據非聚集索引中資料型別的不同,每個非聚集索引結構會有乙個或多個分配單元,在其中儲存和管理特定分割槽的資料。每個非聚集索引至少有乙個針對每個分割槽的 in_row_data 分配單元(儲存索引 b 樹頁)。如果非聚集索引包含大型物件 (lob) 列,則還有乙個針對每個分割槽的 lob_data 分配單元。此外,如果非聚集索引包含的可變長度列超過 8,060 位元組行大小限制,則還有乙個針對每個分割槽的row_overflow_data 分配單元。有關分配單元的詳細資訊,請參閱表組織和索引組織。b 樹的頁集合由sys.system_internals_allocation_units系統檢視中的root_page指標定位。
sys.system_internals_allocation_units系統檢視保留為僅供 microsoft sql server 內部使用。不保證以後的相容性。
下圖說明了單個分割槽中的非聚集索引結構。
包含列的索引
通過將包含列(稱為非鍵列)新增到索引的葉級,可以擴充套件非聚集索引的功能。鍵列儲存在非聚集索引的所有級別,而非鍵列僅儲存在葉級別
聚集索引與非聚集索引
非聚集索引也是堆結構?其實sqlserver有幾種頁面型別 資料都使用一頁一頁來儲存,就像windows的記憶體也是使用頁面來組織的 感興趣的朋友可以了解下,希望本文可以增加你們對非聚集索引結構的理解。我們知道sqlserver的資料行的儲存有兩種資料結構 a 堆b b樹 binary 二叉樹 資料...
聚集索引與非聚集索引
一 聚集索引概念 漢語字典的正文本身就是乙個聚集索引。比如,我們要查 安 字,就會很自然地翻開字典的前幾頁,因為 安 的拼音是 an 而按照拼音排序漢字的字典是以英文本母 a 開頭並以 z 結尾的,那麼 安 字就自然地排在字典的前部。如果您翻完了所有以 a 開頭的部分仍然找不到這個字,那麼就說明您的...
聚集索引與非聚集索引
1 聚集索引 聚集索引的意思可以理解為順序排列,比如乙個主鍵自增的錶即為聚集索引,即id為1的存在於第一條,id為2的存在於第二條.假使資料庫中是使用陣列來存放的這張表中的資料,那麼如果我需要查詢第100條,那麼直接第一條資料的位址加上100即為第一百條的位址,一次就能查詢出來。因為資料庫中的資料只...