人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動(dòng)態(tài)

理解Sql Server中的聚集索引

發(fā)布日期:2021-12-25 11:53 | 文章來(lái)源:gibhub

說(shuō)到聚集索引,我想每個(gè)碼農(nóng)都明白,但是也有很多像我這樣的猥程序員,只能用死記硬背來(lái)解決這個(gè)問(wèn)題,什么表中只能建一個(gè)聚集索引,然后又扯到了目錄查找來(lái)幫助讀者記憶。。。。問(wèn)題就在這里,我們不是學(xué)文科,,,不需要去死記硬背,,,我們需要的就是能看到在眼里面的真實(shí)東西。。。。。我們都喜歡聚集索引,因?yàn)樗軌虬褵o(wú)序的堆表記錄變成有序,還玩起了B樹(shù)。。。這樣就把復(fù)雜度從N降低到了LogMN。。。

這樣的話邏輯讀,物理讀就下來(lái)了。

一:現(xiàn)象

1:無(wú)索引的情況

還是老規(guī)矩,看個(gè)例子感受下,首先我有一個(gè)Product表,里面沒(méi)有任何索引,如下圖:

從上圖中,我悲劇的看到了,物理讀是9次,也就說(shuō)明走了9次硬盤(pán),你也可以想到,走硬盤(pán)的目的是為了拿數(shù)據(jù),邏輯讀有1636次,要注意的是這里的”次“是“頁(yè)”的意思,也就是在內(nèi)存中走了1636個(gè)數(shù)據(jù)頁(yè),我用dbcc ind 給你看一下,是不是有1636個(gè)表數(shù)據(jù)頁(yè)。

這里有1637個(gè)數(shù)據(jù)頁(yè)的原因是第一個(gè)是IAM跟蹤頁(yè)。

2:有聚集索引的情況

下面我在Product表中建一個(gè)product_idx_productid的聚集索引,然后再次看看io情況,如下圖:

當(dāng)你看到這個(gè)”邏輯讀“為3次的時(shí)候,你是不是已經(jīng)瘋了。。。在多達(dá)1636個(gè)數(shù)據(jù)頁(yè)中找到目標(biāo)數(shù)據(jù),只需3次。。。。這個(gè)在算法盲看來(lái)是不是神

仙下凡???當(dāng)然,,,此物天上有,人間也有。。。既然有,就應(yīng)該有一種非常強(qiáng)烈的探索欲。。。。看看這里面到底是怎么玩的。。。。。。

二:探索原理

1:探索葉子節(jié)點(diǎn)

剛才也說(shuō)了,聚集索引玩的就是B樹(shù),既然是B樹(shù),那就有葉子節(jié)點(diǎn)和分支節(jié)點(diǎn),專業(yè)術(shù)語(yǔ)就是度為0的為葉子節(jié)點(diǎn),度>0的叫做分支節(jié)點(diǎn)。。。。

我想你也聽(tīng)說(shuō)了,聚集索引是將索引列數(shù)據(jù)進(jìn)行排序后放入B樹(shù),那為了讓你眼見(jiàn)為實(shí),我先建立一個(gè)ID無(wú)序的3條記錄。

復(fù)制代碼 代碼如下:

dbcc traceon(3604)
dbcc page(Ctrip,1,120,1)

然后我用dbcc ind 命令查看下3條記錄在哪個(gè)數(shù)據(jù)頁(yè)中,如圖:

從圖中可以看到,我的三條記錄是放在148號(hào)數(shù)據(jù)頁(yè)中的,然后我導(dǎo)出148號(hào)數(shù)據(jù)頁(yè),看看內(nèi)容是什么。

復(fù)制代碼 代碼如下:

dbcc traceon(3604)
dbcc page(Ctrip,1,173,1)

從上圖中,我們看到了”數(shù)據(jù)頁(yè)“中的各個(gè)槽位的指向是按照表中的實(shí)際存儲(chǔ)記錄來(lái)的,好了,下面我創(chuàng)建個(gè)聚集索引,看看實(shí)際數(shù)據(jù)是不是真的有序了?

復(fù)制代碼 代碼如下:

create clustered index Ctrip_idx_ID on Person(ID)

不過(guò)在這里有個(gè)有趣的問(wèn)題,我的148號(hào)”表數(shù)據(jù)頁(yè)“哪去了???也是夠奇葩的,換來(lái)的確實(shí)173號(hào)索引頁(yè),那為了保證數(shù)據(jù)完整性,應(yīng)該是把148號(hào)數(shù)據(jù)頁(yè)的內(nèi)容灌到173索引頁(yè)里面去了吧???? 沒(méi)關(guān)系,驗(yàn)證一下。

復(fù)制代碼 代碼如下:

dbcc traceon(3604)
dbcc page(Ctrip,1,173,1)

通過(guò)上面的圖,有沒(méi)有直觀的感覺(jué)到? 數(shù)據(jù)現(xiàn)在已經(jīng)是aaaaa,bbbbb,ccccc的模式了。。。有序啦。。。。同時(shí)索引頁(yè)中也保存了148號(hào)數(shù)據(jù)

頁(yè)的字段值,比如ID,Name信息,拿下面的slot0槽位舉例:

到此為止,我想你對(duì)葉子節(jié)點(diǎn)的內(nèi)容有了個(gè)大概的認(rèn)識(shí),起碼沒(méi)有讓你死記硬背了~~~

2 :探索分支節(jié)點(diǎn)

為了讓你看到分支節(jié)點(diǎn),我得多灌一些數(shù)據(jù)進(jìn)去,好歹要讓數(shù)據(jù)撐破一個(gè)索引數(shù)據(jù)頁(yè),這樣分支節(jié)點(diǎn)索引數(shù)據(jù)頁(yè)就出來(lái)了,看下面的例子:

從圖中可以看到,當(dāng)我插入1000條數(shù)據(jù)的時(shí)候,已經(jīng)出現(xiàn)了一個(gè)分支節(jié)點(diǎn)(120號(hào)索引數(shù)據(jù)頁(yè)),三個(gè)葉子節(jié)點(diǎn)(173,121,126),葉子

節(jié)點(diǎn)的數(shù)據(jù)頁(yè)內(nèi)容我也說(shuō)過(guò)了,現(xiàn)在我很好奇”分支節(jié)點(diǎn)“中保存著什么內(nèi)容???我好興奮,我要導(dǎo)出120號(hào)索引數(shù)據(jù)頁(yè)了。。。

復(fù)制代碼 代碼如下:

dbcc traceon(3604)
dbcc page(Ctrip,1,120,1)

簡(jiǎn)單分析下slot0:06000000 00ad0000 000100 的內(nèi)容

00000000:葉子索引頁(yè)中的最小key值(這里有點(diǎn)特殊,除一行記錄不是保存最小值以外,其余都是的),轉(zhuǎn)換為十進(jìn)制就是0。

ad000000:葉子索引頁(yè)的頁(yè)號(hào),轉(zhuǎn)換為十進(jìn)制就是173。

0100:葉子索引頁(yè)的文件號(hào),轉(zhuǎn)換為十進(jìn)制就是1.

不過(guò)通過(guò)分析,我們看到了,其實(shí)分支節(jié)點(diǎn)中保存著有兩個(gè)值,一個(gè)childpage的minkey,一個(gè)childpage的pageid,同理,其他的槽位也是這樣。

我們換個(gè)參數(shù)命令,讓結(jié)果更直觀點(diǎn),記錄中就是保存著”pageID“和”minKey“。

這樣的話,我腦海中就有一張圖出來(lái)了,不知道你現(xiàn)在是否有了????

通過(guò)上面的分析,除了第一行記錄不是保存子索引頁(yè)中最小key的值外,其他記錄都是提取子索引頁(yè)中的最小索引鍵值,這一點(diǎn)要注意。。。

也許對(duì)sqlserver團(tuán)隊(duì)來(lái)說(shuō),只要判斷小于449的話就直接去(1:173)數(shù)據(jù)頁(yè),小于889的直接去(1:121)數(shù)據(jù)頁(yè)就可以啦。。。

當(dāng)你看到這里的時(shí)候,不知道你是否已經(jīng)明白,為什么表中只能有一個(gè)聚集索引呢???好了,亂雞巴扯了好多,希望對(duì)你有所幫助。

版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實(shí)時(shí)開(kāi)通

自選配置、實(shí)時(shí)開(kāi)通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問(wèn)服務(wù)

1對(duì)1客戶咨詢顧問(wèn)

在線
客服

在線客服:7*24小時(shí)在線

客服
熱線

400-630-3752
7*24小時(shí)客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部