聚集索引
概述
關於索引和表體系結構的概念一直都是討論比較多的話題,其中表的各種儲存形式是討論的重點,在各個網站上面也有很多關於這方面寫的不錯的文章,我寫這篇文章的目的也是為了將所有的知識點儘可能的組織起來結合自己對這方面的瞭解些一篇關於的詳細文章出來,同時也會列出一些我自己有疑惑的地方拿出來探討,介於表達能力有限,有些地方可能無法表達的很明瞭,還望大家包涵;對於文章中有不對的地方也希望大家能提出,寫文章的目的就是為了共享資源;對於這個系列會寫5篇文章,在接下來的幾天裡逐一發布,分別是“聚集索引體系結構”,“非聚集索引體系結構”,“堆體系結構”,“具有包含列的索引”,“表組織和索引組織”。
正文
- 定義
在 SQL Server 中,索引是按 B 樹結構進行組織的。索引 B 樹中的每一頁稱為一個索引節點。B 樹的頂端節點稱為根節點。索引中的底層節點稱為葉節點。根節點與葉節點之間的任何索引級別統稱為中間級。在聚集索引中,葉節點包含基礎表的資料頁。根節點和中間級節點包含存有索引行的索引頁。每個索引行包含一個鍵值和一個指標,該指標指向 B 樹上的某一中間級頁或葉級索引中的某個資料行。每級索引中的頁均被連結在雙向連結列表中。
- 聚集索引單個分割槽中的結構
- 儲存
在SQL Server中,儲存資料的最小單位是頁,資料頁的大小是8K,,8個頁組成一個區64K,每一頁所能容納的資料為8060位元組,聚集索引的葉節點儲存的是實際資料行,而且每頁資料行是順序儲存,資料行基於聚集索引鍵按順序儲存,所以一個資料表只能建一個聚集索引。
非葉子節點(跟節點和中間級)儲存的是索引記錄,一條索引記錄包含:鍵值(鍵值也就是聚集索引列的欄位值)+指標(指向索引頁或者資料頁)
由於資料儲存在資料頁中,索引建儲存在索引頁中,所以檢索單個索引列的資料要快於檢索資料記錄,因為不需要讀取資料頁,只需要在索引頁中檢索資料。
- 聚集索引列選擇
窄列(欄位長度短的列):由於索引頁儲存的是索引記錄,索引記錄儲存的是索引建值和指標,為了讓索引列儲存更多的索引記錄,所以我們選擇窄列。
不頻繁更新的列:由於索引記錄的指標指向資料頁,如果資料頻繁更新會造成索引頁更新,同時由於非聚集索引的資料頁的行指標指向聚集索引的資料行,更新聚集索引同時也會造非聚集索引頁的更改造成IO消耗。
不重複的列:由於聚集索引的資料頁中的資料記錄是按聚集建的順序儲存,當向聚集列中插入重複的記錄,當資料頁超過8060K就會造成分頁,分頁會將原頁中的一半記錄插入到新頁中,而產生索引碎片。
可以使用自增列作為聚集索引列(這裡只是給個建議,需要根據實際的業務來)
備註: 作者:pursuer.chen 部落格:http://www.cnblogs.com/chenmh 本站點所有隨筆都是原創,歡迎大家轉載;但轉載時必須註明文章來源,且在文章開頭明顯處給明連結,否則保留追究責任的權利。 《歡迎交流討論》 |