SQLSERVER的非聚集索引結構深度理解
我們知道SQLSERVER的數(shù)據(jù)行的存儲有兩種數(shù)據(jù)結構:A: 堆 B :B樹(binary 二叉樹)
數(shù)據(jù)按照這種兩種的其中一種來排序和存儲,學過數(shù)據(jù)結構的朋友應該知道二叉樹,為什麼用二叉樹,因為方便用二分查找法來快速
找到數(shù)據(jù)。如果是堆,那么數(shù)據(jù)是不按照任何順序排序的,也沒有任何結構,數(shù)據(jù)頁面也不是首尾相連的,不像B樹,數(shù)據(jù)頁面
使用雙向鏈表首尾相連。堆表只依靠表里的IAM頁(索引分配映射頁)將堆的頁面聯(lián)系在一起,IAM里記錄了頁面編號,頁面位置
除非表里有聚集索引,如果沒有的話那么表里的數(shù)據(jù)的存儲就是堆結構
那么非聚集索引呢?非聚集索引也是堆結構?其實SQLSERVER有幾種頁面類型(數(shù)據(jù)都使用一頁一頁來存儲,就像Windows的內(nèi)存也是使用頁面來組織的)
其中有一種是索引頁 ,一種是數(shù)據(jù)頁
我感覺很多書都說不清,就像我一樣,在文章的開頭也是這樣說的:數(shù)據(jù)行的存儲有兩種數(shù)據(jù)結構:A: 堆 B :B樹(二叉樹)
我覺得應該是數(shù)據(jù)頁面的存儲有兩種數(shù)據(jù)結構:1、堆 2、B樹
先說一下:索引頁,不管是聚集索引還是非聚集索引,這些索引數(shù)據(jù)都存放在索引頁,而索引頁都是按照B樹的結構里存儲的
而堆頁:也就是實際的數(shù)據(jù)行,如果表里沒有聚集索引,那么實際的數(shù)據(jù)就放在堆頁,如果聚集索引,那么數(shù)據(jù)就放在索引頁
而B樹里的節(jié)點 ,其實又叫頁面,又叫節(jié)點 在B樹里會有一頁:root page(亦即是根節(jié)點),非聚集索引和聚集索引都是一樣的
所以:數(shù)據(jù)行的存儲有兩種數(shù)據(jù)結構:A: 堆 B :B樹(二叉樹)
上面這句話應該明白了吧?
在說一下,在堆里的數(shù)據(jù)頁面完全是隨機存放的,而數(shù)據(jù)頁面之間唯一的邏輯連接是記錄在IAM頁里的,所以IAM頁也就扮演了root page的角色
那么聚集索引呢?聚集索引也是堆結構?
非聚集索引放在索引頁,B樹結構,數(shù)據(jù)依舊放在堆頁,那么如果數(shù)據(jù)頁放在堆里,不像聚集索引放在B樹的葉子節(jié)點里
(亦即是放在索引頁里),那么非聚集索引和實際的數(shù)據(jù)如何發(fā)生聯(lián)系呢?
答案是:在非聚集索引的葉子節(jié)點(葉子頁面)會有行定位器,而行定位器的作用請看下面紅色字
非聚集索引與聚集索引具有相同的B樹結構,他們之間的顯著差別在于以下兩點:
(1)基礎表的數(shù)據(jù)行不按非聚集鍵的順序排序和存儲
(2)非聚集索引的葉層是由索引頁而不是由數(shù)據(jù)頁組成
(3)建立非聚集索引的表可以是一個B樹,也可以是一個堆
(4)如果表是堆(意味著該表沒有聚集索引),行定位器指向行的指針。該指針是由文件標識符ID:頁碼:頁上的行數(shù)生成。整個
指針稱為行ID(RID)
(5)如果表有聚集索引或索引視圖上有聚集索引,則行定位器會指向聚集索引鍵。SQL通過使用存儲在非聚集索引的葉子內(nèi)的
指針(指向聚集索引鍵)搜索聚集索引來檢索實際數(shù)據(jù)
非聚集索引不會改變或改善實際數(shù)據(jù)頁的存儲模式。他的B樹結構只針對自己的索引頁面。
不過,非聚集索引跟聚集索引的作用還是一樣的,相當于檢字表
最后總結一下吧,這麼短的隨筆總結啥子呢?
當然是總結表的結構,因為曾經(jīng)有人在論壇里問過一張表的結構
A 有聚集索引的表或者有聚集索引也有非聚集索引 (B樹)
B 沒有任何索引(堆)
C 沒有聚集索引,有非聚集索引(B樹+堆)
論壇里有人簡稱A為聚集表 ,B和C為堆表
記得以前在大學里數(shù)據(jù)結構老師講過的一些數(shù)據(jù)結構:大根堆 ,小根堆 ,雙向鏈表,二叉樹
可惜現(xiàn)在全部還給老師了
附上圖片
堆表的結構
非聚集索引的結構
聚集索引的結構
相關文章
Windows故障轉移群集 和 SQLServer AlwaysOn 配置搭建詳
這篇文章主要介紹了Windows故障轉移群集 和 SQLServer AlwaysOn 搭建教程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-03-03MSSQL內(nèi)外連接(INNER JOIN)語句詳解
這幾天重新溫習了一下SQL的書本,現(xiàn)在的思路應該是很清楚了,現(xiàn)在把自己的理解發(fā)出來給大家溫習下。希望和我一樣對SQL的連接語句不太理解的朋友能夠有所幫助2006-11-11SQL Server"錯誤 21002: [SQL-DMO]用戶 * 已經(jīng)存在問題解決
在分配數(shù)據(jù)庫登錄用戶的數(shù)據(jù)庫訪問權限的時候出現(xiàn)這種錯誤,如果選中某一個數(shù)據(jù)庫的任何一個角色就會出現(xiàn)這個錯誤2009-04-04sqlserverdriver配置方法 jdbc連接sqlserver
這篇文章主要介紹了sqlserverdriver配置方法,介紹了連接SqlServer2000 和連接SqlServer2005的方法,大家參考使用吧2014-01-01