懂得Sql Server中的集合索引。本站提示廣大學習愛好者:(懂得Sql Server中的集合索引)文章只能為提供參考,不一定能成為您想要的結果。以下是懂得Sql Server中的集合索引正文
說到集合索引,我想每一個碼農都明確,然則也有許多像我如許的猥法式員,只能用逝世記硬背來處理這個成績,甚麼表中只能建一個集合索引,然後又扯到了目次查找來贊助讀者記憶。。。。成績就在這裡,我們不是學理科,,,不須要去逝世記硬背,,,我們須要的就是能看到在眼外面的真實器械。。。。。我們都愛好集合索引,由於它可以或許把無序的堆表記載釀成有序,還玩起了B樹。。。如許就把龐雜度從N下降到了LogMN。。。
如許的話邏輯讀,物理讀就上去了。
一:景象
1:無索引的情形
照樣老例子,看個例子感觸感染下,起首我有一個Product表,外面沒有任何索引,以下圖:
從上圖中,我喜劇的看到了,物理讀是9次,也就解釋走了9次硬盤,你也能夠想到,走硬盤的目標是為了拿數據,邏輯讀有1636次,要留意的是這裡的”次“是“頁”的意思,也就是在內存中走了1636個數據頁,我用dbcc ind 給你看一下,是否是有1636個表數據頁。
這裡有1637個數據頁的緣由是第一個是IAM跟蹤頁。
2:有集合索引的情形
上面我在Product表中建一個product_idx_productid的集合索引,然後再次看看io情形,以下圖:
當你看到這個”邏輯讀“為3次的時刻,你是否是曾經瘋了。。。在多達1636個數據頁中找到目的數據,只需3次。。。。這個在算法盲看來是否是神
仙下凡???固然,,,此物天上有,人世也有。。。既然有,就應當有一種異常激烈的摸索欲。。。。看看這外面究竟是怎樣玩的。。。。。。
二:摸索道理
1:摸索葉子節點
適才也說了,集合索引玩的就是B樹,既然是B樹,那就有葉子節點和分支節點,專業術語就是度為0的為葉子節點,度>0的叫做分支節點。。。。
我想你也據說了,集合索引是將索引列數據停止排序後放入B樹,那為了讓你目擊為實,我先樹立一個ID無序的3筆記錄。
dbcc traceon(3604)
dbcc page(Ctrip,1,120,1)
然後我用dbcc ind 敕令檢查下3筆記錄在哪一個數據頁中,如圖:
從圖中可以看到,我的三筆記錄是放在148號數據頁中的,然後我導出148號數據頁,看看內容是甚麼。
dbcc traceon(3604)
dbcc page(Ctrip,1,173,1)
從上圖中,我們看到了”數據頁“中的各個槽位的指向是依照表中的現實存儲記載來的,好了,上面我創立個集合索引,看看現實數據是否是真的有序了?
create clustered index Ctrip_idx_ID on Person(ID)
不外在這裡有個風趣的成績,我的148號”表數據頁“哪去了???也是夠奇葩的,換來切實其實實173號索引頁,那為了包管數據完全性,應當是把148號數據頁的內容灌到173索引頁外面去了吧???? 沒緊要,驗證一下。
dbcc traceon(3604)
dbcc page(Ctrip,1,173,1)
經由過程下面的圖,有無直不雅的感到到? 數據如今曾經是aaaaa,bbbbb,ccccc的形式了。。。有序啦。。。。同時索引頁中也保留了148號數據
頁的字段值,好比ID,Name信息,拿上面的slot0槽位舉例:
到此為止,我想你對葉子節點的內容有了個年夜概的熟悉,最少沒有讓你逝世記硬背了~~~
2 :摸索分支節點
為了讓你看到分支節點,我很多灌一些數據出來,好歹要讓數據撐破一個索引數據頁,如許分支節點索引數據頁就出來了,看上面的例子:
從圖中可以看到,當我拔出1000條數據的時刻,曾經湧現了一個分支節點(120號索引數據頁),三個葉子節點(173,121,126),葉子
節點的數據頁內容我也說過了,如今我很獵奇”分支節點“中保留著甚麼內容???我好高興,我要導出120號索引數據頁了。。。
dbcc traceon(3604)
dbcc page(Ctrip,1,120,1)
簡略剖析下slot0:06000000 00ad0000 000100 的內容
00000000:葉子索引頁中的最小key值(這裡有點特別,除一行記載不是保留最小值之外,其他都是的),轉換為十進制就是0。
ad000000:葉子索引頁的頁號,轉換為十進制就是173。
0100:葉子索引頁的文件號,轉換為十進制就是1.
不外經由過程剖析,我們看到了,其實分支節點中保留著有兩個值,一個childpage的minkey,一個childpage的pageid,同理,其他的槽位也是如許。
我們換個參數敕令,讓成果更直不雅點,記載中就是保留著”pageID“和”minKey“。
如許的話,我腦海中就有一張圖出來了,不曉得你如今能否有了????
經由過程下面的剖析,除第一行記載不是保留子索引頁中最小key的值外,其他記載都是提取子索引頁中的最小索引鍵值,這一點要留意。。。
或許對sqlserver團隊來講,只需斷定小於449的話就直接去(1:173)數據頁,小於889的直接去(1:121)數據頁便可以啦。。。
當你看到這裡的時刻,不曉得你能否曾經明確,為何表中只能有一個集合索引呢???好了,亂雞巴扯了很多多少,願望對你有所贊助。