標籤:style blog http os 使用 io strong ar 資料
轉自:http://www.cnblogs.com/chenmh/p/3780221.html
叢集索引
概述
關於索引和表體繫結構的概念一直都是討論比較多的話題,其中表的各種儲存形式是討論的重點,在各個網站上面也有很多關於這方面寫的不錯的文章,我寫這篇文章的目的也是為了將所有的知識點儘可能的組織起來結合自己對這方面的瞭解些一篇關於的詳細文章出來,同時也會列出一些我自己有疑惑的地方拿出來探討,介於表達能力有限,有些地方可能無法表達的很明了,還望大家包涵;對於文章中有不對的地方也希望大家能提出,寫文章的目的就是為了共用資源;對於這個系列會寫5篇文章,在接下來的幾天裡逐一發布,分別是“叢集索引體繫結構”,“非叢集索引體繫結構”,“堆體繫結構”,“具有內含資料行索引”,“表組織和索引組織”。
本文
在 SQL Server 中,索引是按 B 樹結構進行組織的。索引 B 樹中的每一頁稱為一個索引節點。B 樹的頂端節點稱為根節點。索引中的底層節點稱為分葉節點。根節點與分葉節點之間的任何索引層級統稱為中間級。在叢集索引中,分葉節點包含基礎資料表的資料頁。根節點和中間級節點包含存有索引行的索引頁。每個索引行包含一個索引值和一個指標,該指標指向 B 樹上的某一中間級頁或葉級索引中的某個資料行。每級索引中的頁均被連結在雙向連結清單中。
在SQL Server中,儲存資料的最小單位是頁,資料頁的大小是8K,,8個頁組成一個區64K,每一頁所能容納的資料為8060位元組,叢集索引的分葉節點儲存的是實際資料行,而且每頁資料行是順序儲存,資料行基於叢集索引鍵按順序儲存,所以一個資料表只能建一個叢集索引。
非葉子節點(跟節點和中間級)儲存的是索引記錄,一條索引記錄包含:索引值(索引值也就是叢集索引列的欄位值)+指標(指向索引頁或者資料頁)
由於資料存放區在資料頁中,索引建儲存在索引頁中,所以檢索單個索引列的資料要快於檢索資料記錄,因為不需要讀取資料頁,只需要在索引頁中檢索資料。
窄列(欄位長度短的列):由於索引頁儲存的是索引記錄,索引記錄儲存的是索引建值和指標,為了讓索引列儲存更多的索引記錄,所以我們選擇窄列。
不頻繁更新的列:由於索引記錄的指標指向資料頁,如果資料頻繁更新會造成索引頁更新,同時由於非叢集索引的資料頁的行指標指向叢集索引的資料行,更新叢集索引同時也會造非叢集索引頁的更改造成IO消耗。
不重複的列:由於叢集索引的資料頁中的資料記錄是按聚集建的順序儲存,當向聚集列中插入重複的記錄,當資料頁超過8060K就會造成分頁,分頁會將原頁中的一半記錄插入到新頁中,而產生索引片段。
可以使用自增列作為叢集索引列(這裡只是給個建議,需要根據實際的業務來)
總結
可能是我的表達能力比較差的原因,很多時候對於自己想表達的內容無法用文字的形式來描述,這也是寫文章的難處吧!
SQL Server 索引和表體繫結構(一)