程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> MSSQL >> 懂得Sql Server中的集合索引

懂得Sql Server中的集合索引

編輯:MSSQL

懂得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)數據頁便可以啦。。。

 當你看到這裡的時刻,不曉得你能否曾經明確,為何表中只能有一個集合索引呢???好了,亂雞巴扯了很多多少,願望對你有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved