我們知道SQLSERVER的數(shù)據(jù)行的存儲(chǔ)有兩種數(shù)據(jù)結(jié)構(gòu):A: 堆 B :B樹(shù)(binary 二叉樹(shù))
數(shù)據(jù)按照這種兩種的其中一種來(lái)排序和存儲(chǔ),學(xué)過(guò)數(shù)據(jù)結(jié)構(gòu)的朋友應(yīng)該知道二叉樹(shù),為什麼用二叉樹(shù),因?yàn)榉奖阌枚植檎曳▉?lái)快速
找到數(shù)據(jù)。如果是堆,那么數(shù)據(jù)是不按照任何順序排序的,也沒(méi)有任何結(jié)構(gòu),數(shù)據(jù)頁(yè)面也不是首尾相連的,不像B樹(shù),數(shù)據(jù)頁(yè)面
使用雙向鏈表首尾相連。堆表只依靠表里的IAM頁(yè)(索引分配映射頁(yè))將堆的頁(yè)面聯(lián)系在一起,IAM里記錄了頁(yè)面編號(hào),頁(yè)面位置
除非表里有聚集索引,如果沒(méi)有的話(huà)那么表里的數(shù)據(jù)的存儲(chǔ)就是堆結(jié)構(gòu)
那么非聚集索引呢?非聚集索引也是堆結(jié)構(gòu)?其實(shí)SQLSERVER有幾種頁(yè)面類(lèi)型(數(shù)據(jù)都使用一頁(yè)一頁(yè)來(lái)存儲(chǔ),就像Windows的內(nèi)存也是使用頁(yè)面來(lái)組織的)
其中有一種是索引頁(yè) ,一種是數(shù)據(jù)頁(yè)
我感覺(jué)很多書(shū)都說(shuō)不清,就像我一樣,在文章的開(kāi)頭也是這樣說(shuō)的:數(shù)據(jù)行的存儲(chǔ)有兩種數(shù)據(jù)結(jié)構(gòu):A: 堆 B :B樹(shù)(二叉樹(shù))
我覺(jué)得應(yīng)該是數(shù)據(jù)頁(yè)面的存儲(chǔ)有兩種數(shù)據(jù)結(jié)構(gòu):1、堆 2、B樹(shù)
先說(shuō)一下:索引頁(yè),不管是聚集索引還是非聚集索引,這些索引數(shù)據(jù)都存放在索引頁(yè),而索引頁(yè)都是按照B樹(shù)的結(jié)構(gòu)里存儲(chǔ)的
而堆頁(yè):也就是實(shí)際的數(shù)據(jù)行,如果表里沒(méi)有聚集索引,那么實(shí)際的數(shù)據(jù)就放在堆頁(yè),如果聚集索引,那么數(shù)據(jù)就放在索引頁(yè)
而B(niǎo)樹(shù)里的節(jié)點(diǎn) ,其實(shí)又叫頁(yè)面,又叫節(jié)點(diǎn) 在B樹(shù)里會(huì)有一頁(yè):root page(亦即是根節(jié)點(diǎn)),非聚集索引和聚集索引都是一樣的
所以:數(shù)據(jù)行的存儲(chǔ)有兩種數(shù)據(jù)結(jié)構(gòu):A: 堆 B :B樹(shù)(二叉樹(shù))
上面這句話(huà)應(yīng)該明白了吧?
在說(shuō)一下,在堆里的數(shù)據(jù)頁(yè)面完全是隨機(jī)存放的,而數(shù)據(jù)頁(yè)面之間唯一的邏輯連接是記錄在IAM頁(yè)里的,所以IAM頁(yè)也就扮演了root page的角色
那么聚集索引呢?聚集索引也是堆結(jié)構(gòu)?
非聚集索引放在索引頁(yè),B樹(shù)結(jié)構(gòu),數(shù)據(jù)依舊放在堆頁(yè),那么如果數(shù)據(jù)頁(yè)放在堆里,不像聚集索引放在B樹(shù)的葉子節(jié)點(diǎn)里
(亦即是放在索引頁(yè)里),那么非聚集索引和實(shí)際的數(shù)據(jù)如何發(fā)生聯(lián)系呢?
答案是:在非聚集索引的葉子節(jié)點(diǎn)(葉子頁(yè)面)會(huì)有行定位器,而行定位器的作用請(qǐng)看下面紅色字
非聚集索引與聚集索引具有相同的B樹(shù)結(jié)構(gòu),他們之間的顯著差別在于以下兩點(diǎn):
(1)基礎(chǔ)表的數(shù)據(jù)行不按非聚集鍵的順序排序和存儲(chǔ)
(2)非聚集索引的葉層是由索引頁(yè)而不是由數(shù)據(jù)頁(yè)組成
(3)建立非聚集索引的表可以是一個(gè)B樹(shù),也可以是一個(gè)堆
(4)如果表是堆(意味著該表沒(méi)有聚集索引),行定位器指向行的指針。該指針是由文件標(biāo)識(shí)符ID:頁(yè)碼:頁(yè)上的行數(shù)生成。整個(gè)
指針?lè)Q為行ID(RID)
(5)如果表有聚集索引或索引視圖上有聚集索引,則行定位器會(huì)指向聚集索引鍵。SQL通過(guò)使用存儲(chǔ)在非聚集索引的葉子內(nèi)的
指針(指向聚集索引鍵)搜索聚集索引來(lái)檢索實(shí)際數(shù)據(jù)
非聚集索引不會(huì)改變或改善實(shí)際數(shù)據(jù)頁(yè)的存儲(chǔ)模式。他的B樹(shù)結(jié)構(gòu)只針對(duì)自己的索引頁(yè)面。
不過(guò),非聚集索引跟聚集索引的作用還是一樣的,相當(dāng)于檢字表
最后總結(jié)一下吧,這麼短的隨筆總結(jié)啥子呢?
當(dāng)然是總結(jié)表的結(jié)構(gòu),因?yàn)樵?jīng)有人在論壇里問(wèn)過(guò)一張表的結(jié)構(gòu)
A 有聚集索引的表或者有聚集索引也有非聚集索引 (B樹(shù))
B 沒(méi)有任何索引(堆)
C 沒(méi)有聚集索引,有非聚集索引(B樹(shù)+堆)
論壇里有人簡(jiǎn)稱(chēng)A為聚集表 ,B和C為堆表
記得以前在大學(xué)里數(shù)據(jù)結(jié)構(gòu)老師講過(guò)的一些數(shù)據(jù)結(jié)構(gòu):大根堆 ,小根堆 ,雙向鏈表,二叉樹(shù)
可惜現(xiàn)在全部還給老師了
附上圖片
堆表的結(jié)構(gòu)

非聚集索引的結(jié)構(gòu)

聚集索引的結(jié)構(gòu)

您可能感興趣的文章:- sqlserver 2008手工修改表結(jié)構(gòu),表不能保存的問(wèn)題與解決方法
- 還原sqlserver2008 媒體的簇的結(jié)構(gòu)不正確的解決方法
- 使用SQLSERVER 2005/2008 遞歸CTE查詢(xún)樹(shù)型結(jié)構(gòu)的方法
- 如何獲取SqlServer2005表結(jié)構(gòu)(字段,主鍵,外鍵,遞增,描述)
- 調(diào)整SQLServer2000運(yùn)行中數(shù)據(jù)庫(kù)結(jié)構(gòu)