佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > SQLSERVER的非聚集索引結(jié)構(gòu)深度理解

SQLSERVER的非聚集索引結(jié)構(gòu)深度理解

熱門標(biāo)簽:Linux服務(wù)器 網(wǎng)站排名優(yōu)化 地方門戶網(wǎng)站 百度競價排名 服務(wù)外包 呼叫中心市場需求 AI電銷 鐵路電話系統(tǒng)

我們知道SQLSERVER的數(shù)據(jù)行的存儲有兩種數(shù)據(jù)結(jié)構(gòu):A: 堆   B :B樹(binary 二叉樹)

數(shù)據(jù)按照這種兩種的其中一種來排序和存儲,學(xué)過數(shù)據(jù)結(jié)構(gòu)的朋友應(yīng)該知道二叉樹,為什麼用二叉樹,因為方便用二分查找法來快速

找到數(shù)據(jù)。如果是堆,那么數(shù)據(jù)是不按照任何順序排序的,也沒有任何結(jié)構(gòu),數(shù)據(jù)頁面也不是首尾相連的,不像B樹,數(shù)據(jù)頁面

使用雙向鏈表首尾相連。堆表只依靠表里的IAM頁(索引分配映射頁)將堆的頁面聯(lián)系在一起,IAM里記錄了頁面編號,頁面位置

除非表里有聚集索引,如果沒有的話那么表里的數(shù)據(jù)的存儲就是堆結(jié)構(gòu)

那么非聚集索引呢?非聚集索引也是堆結(jié)構(gòu)?其實SQLSERVER有幾種頁面類型(數(shù)據(jù)都使用一頁一頁來存儲,就像Windows的內(nèi)存也是使用頁面來組織的)

其中有一種是索引頁 ,一種是數(shù)據(jù)頁

我感覺很多書都說不清,就像我一樣,在文章的開頭也是這樣說的:數(shù)據(jù)行的存儲有兩種數(shù)據(jù)結(jié)構(gòu):A: 堆   B :B樹(二叉樹)

我覺得應(yīng)該是數(shù)據(jù)頁面的存儲有兩種數(shù)據(jù)結(jié)構(gòu):1、堆  2、B樹

先說一下:索引頁,不管是聚集索引還是非聚集索引,這些索引數(shù)據(jù)都存放在索引頁,而索引頁都是按照B樹的結(jié)構(gòu)里存儲的

而堆頁:也就是實際的數(shù)據(jù)行,如果表里沒有聚集索引,那么實際的數(shù)據(jù)就放在堆頁,如果聚集索引,那么數(shù)據(jù)就放在索引頁

而B樹里的節(jié)點 ,其實又叫頁面,又叫節(jié)點  在B樹里會有一頁:root page(亦即是根節(jié)點),非聚集索引和聚集索引都是一樣的

所以:數(shù)據(jù)行的存儲有兩種數(shù)據(jù)結(jié)構(gòu):A: 堆   B :B樹(二叉樹)

上面這句話應(yīng)該明白了吧?

在說一下,在堆里的數(shù)據(jù)頁面完全是隨機存放的,而數(shù)據(jù)頁面之間唯一的邏輯連接是記錄在IAM頁里的,所以IAM頁也就扮演了root page的角色


那么聚集索引呢?聚集索引也是堆結(jié)構(gòu)?

非聚集索引放在索引頁,B樹結(jié)構(gòu),數(shù)據(jù)依舊放在堆頁,那么如果數(shù)據(jù)頁放在堆里,不像聚集索引放在B樹的葉子節(jié)點里

(亦即是放在索引頁里),那么非聚集索引和實際的數(shù)據(jù)如何發(fā)生聯(lián)系呢?

答案是:在非聚集索引的葉子節(jié)點(葉子頁面)會有行定位器,而行定位器的作用請看下面紅色字

非聚集索引與聚集索引具有相同的B樹結(jié)構(gòu),他們之間的顯著差別在于以下兩點:

(1)基礎(chǔ)表的數(shù)據(jù)行不按非聚集鍵的順序排序和存儲

(2)非聚集索引的葉層是由索引頁而不是由數(shù)據(jù)頁組成

(3)建立非聚集索引的表可以是一個B樹,也可以是一個堆

(4)如果表是堆(意味著該表沒有聚集索引),行定位器指向行的指針。該指針是由文件標(biāo)識符ID:頁碼:頁上的行數(shù)生成。整個

指針稱為行ID(RID)

(5)如果表有聚集索引或索引視圖上有聚集索引,則行定位器會指向聚集索引鍵。SQL通過使用存儲在非聚集索引的葉子內(nèi)的

指針(指向聚集索引鍵)搜索聚集索引來檢索實際數(shù)據(jù)

非聚集索引不會改變或改善實際數(shù)據(jù)頁的存儲模式。他的B樹結(jié)構(gòu)只針對自己的索引頁面。

不過,非聚集索引跟聚集索引的作用還是一樣的,相當(dāng)于檢字表

最后總結(jié)一下吧,這麼短的隨筆總結(jié)啥子呢?

當(dāng)然是總結(jié)表的結(jié)構(gòu),因為曾經(jīng)有人在論壇里問過一張表的結(jié)構(gòu)

A 有聚集索引的表或者有聚集索引也有非聚集索引   (B樹)

B 沒有任何索引(堆)

C 沒有聚集索引,有非聚集索引(B樹+堆)

論壇里有人簡稱A為聚集表  ,B和C為堆表

記得以前在大學(xué)里數(shù)據(jù)結(jié)構(gòu)老師講過的一些數(shù)據(jù)結(jié)構(gòu):大根堆  ,小根堆 ,雙向鏈表,二叉樹

可惜現(xiàn)在全部還給老師了

 附上圖片

堆表的結(jié)構(gòu)

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

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

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

標(biāo)簽:湘潭 銅川 仙桃 黃山 衡水 崇左 湖南 蘭州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《SQLSERVER的非聚集索引結(jié)構(gòu)深度理解》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    新绛县| 建阳市| 孝感市| 克东县| 淮安市| 阿拉善盟| 祁门县| 呼伦贝尔市| 西城区| 天长市| 白城市| 大埔区| 长宁区| 东乡| 嵩明县| 林州市| 旌德县| 南陵县| 临武县| 太保市| 柞水县| 正镶白旗| 通化市| 钟山县| 祁阳县| 武宁县| 策勒县| 汉川市| 屏南县| 平塘县| 高安市| 莲花县| 普定县| 合阳县| 舟曲县| 建平县| 纳雍县| 马公市| 沙湾县| 南投县| 墨竹工卡县|