我們知道sqlserver的資料行的儲存有兩種資料結構:a: 堆 b :b樹(binary 二叉樹)
資料按照這種兩種的其中一種來排序和儲存,學過資料結構的朋友應該知道二叉樹,為什麼用二叉樹,因為方便用二分查詢法來快速
找到資料。如果是堆,那麼資料是不按照任何順序排序的,也沒有任何結構,資料頁面也不是首尾相連的,不像b樹,資料頁面
使用雙向鍊錶首尾相連。堆表只依靠表裡的iam頁(索引分配對映頁)將堆的頁面聯絡在一起,iam裡記錄了頁面編號,頁面位置
除非表裡有聚集索引,如果沒有的話那麼表裡的資料的儲存就是堆結構
那麼非聚集索引呢?非聚集索引也是堆結構?其實sqlserver有幾種頁面型別(資料都使用一頁一頁來儲存,就像windows的記憶體也是使用頁面來組織的)
其中有一種是索引頁 ,一種是資料頁
我感覺很多書都說不清,就像我一樣,在文章的開頭也是這樣說的:資料行的儲存有兩種資料結構:a: 堆 b :b樹(二叉樹)
我覺得應該是資料頁面的儲存有兩種資料結構:1、堆 2、b樹
先說一下:索引頁,不管是聚集索引還是非聚集索引,這些索引資料都存放在索引頁,而索引頁都是按照b樹的結構裡儲存的
而堆頁:也就是實際的資料行,如果表裡沒有聚集索引,那麼實際的資料就放在堆頁,如果聚集索引,那麼資料就放在索引頁
而b樹里的節點 ,其實又叫頁面,又叫節點 在b樹里會有一頁:root page(亦即是根節點),非聚集索引和聚集索引都是一樣的
所以:資料行的儲存有兩種資料結構:a: 堆 b :b樹(二叉樹)
上面這句話應該明白了吧?
在說一下,在堆裡的資料頁面完全是隨機存放的,而資料頁面之間唯一的邏輯連線是記錄在iam頁裡的,所以iamwww.cppcns.com頁也就扮演了root page的角色
那麼聚集索引呢?聚集索引也是堆結構?
非聚集索引放在索引頁,b樹結構,資料依舊放在堆頁,那麼如果資料頁放在堆裡,不像聚集索引放在b樹的葉子節點裡
(亦即是放在索引頁裡),那麼非聚集索引和實際的資料如何發生聯絡呢?
答案是:在非聚集索引的葉子節點(葉子頁面)會有行定位器,而行定位器的作用請看下面紅色字
非聚集索引與聚集索引具有相同的b樹結構,他們之間的顯著差別在於以下兩點:
(1)基礎表的資料行不按非聚集鍵的順序排序和儲存
(2)非聚集索引的葉層是由索引頁而不是由資料頁組成
(3)建立非聚集索引的表可以是乙個b樹,也可以www.cppcns.com是乙個堆
(4)如果表是堆(意味著該錶沒有聚集索www.cppcns.com引),行定位器指向行的指標。該指標是由檔案識別符號id:頁碼:頁上的行數生成。整個
指標稱為行id(rid)
(5)如果表有聚集索引或索引檢視上有聚集索引,則行定位器會指向聚集索引鍵。sql通過使用儲存在非聚集索引的葉子內的
指標(指向聚集索引鍵)搜尋聚集索引來檢索實際資料
非聚集索引不會改變或改善實際資料頁的儲存模式。他的b樹結構只針對自己的索引頁面。
不過,非聚集索引跟聚集索引的作用還是一樣的,相當於檢字表www.cppcns.com
最後總結一下吧,這麼短的隨筆總結啥子呢?
當然是總結表的結構,因為曾經有人在論壇裡問過一張表的結構
a 有聚集索引的表或者有聚集索引也有非聚集索引 (b樹)
b 沒有任何索引(堆)
c 沒有聚集索引,有非聚集索引(b樹+堆)
論壇裡有人簡稱a為聚集表,b和c為堆表
記得以前在大學裡資料結構老師講過的一些資料結構:大根堆 ,小根堆 ,雙向鍊錶,二叉樹
可惜現在全部還給老師了
附上堆表的結構
非聚集索引的結構
聚集索引的結構
本文標題: sqlserver的非聚集索引結構深度理解
本文位址: /shujuku/mssql/91489.html
sqlserver 聚集索引 非聚集索引
聚集索引是一種對磁碟上實際資料重新組織以按指定的一列或者多列值排序。像我們用到的漢語字典,就是乙個聚集索引。換句話說就是聚集索引會改變資料庫表中資料的存放順序。非聚集索引不會重新組織表中的資料,而是對每一行儲存索引列值並用乙個指標指向資料所在的頁面。乙個值指向多行等於該值的資料 sqlserver預...
SQL SERVER 聚集索引 非聚集索引 區別
一 理解索引的結構 索引在資料庫中的作用類似於目錄在書籍中的作用,用來提高查詢資訊的速度。使用索引查詢資料,無需對整表進行掃瞄,可以快速找到所需資料。微軟的sql server提供了兩種索引 聚集索引 clustered index,也稱聚類索引 簇集索引 和非聚集索引 nonclustered i...
sql server聚集索引與非聚集索引
於 sql server聚集索引與非聚集索引 筆記 雜,淺顯理解 聚集索引按順序查詢 拼音目錄 非聚集索引不按順序查詢 部首目錄 每個表只能有乙個聚集索引,因為目錄只能按照一種方法進行排序。返回某範圍內的資料一項。比如您的某個表有乙個時間列,恰好您把 聚合索引建立在了該列,這時您查詢2004年1月1...