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