萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> 數據庫綜合 >> 如何理解Sql Server中的聚集索引

如何理解Sql Server中的聚集索引

這篇文章主要介紹了如何理解Sql Server中的聚集索引,本文講解了聚集索引的作用、聚集索引的運行原理等內容,需要的朋友可以參考下。

一:現象

1:無索引的情況

還是老規矩,看個例子感受下,首先我有一個Product表,裡面沒有任何索引,如下圖:

如何理解Sql Server中的聚集索引

從上圖中,我悲劇的看到了,物理讀是9次,也就說明走了9次硬盤,你也可以想到,走硬盤的目的是為了拿數據,邏輯讀有1636次,要注意的是這裡的”次“是“頁”的意思,也就是在內存中走了1636個數據頁,我用dbcc ind 給你看一下,是不是有1636個表數據頁。

如何理解Sql Server中的聚集索引

這裡有1637個數據頁的原因是第一個是IAM跟蹤頁。

如何理解Sql Server中的聚集索引

2:有聚集索引的情況

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

如何理解Sql Server中的聚集索引

當你看到這個”邏輯讀“為3次的時候,你是不是已經瘋了。在多達1636個數據頁中找到目標數據,只需3次,這個在算法盲看來是不是神。

仙下凡?當然此物天上有,人間也有。既然有,就應該有一種非常強烈的探索欲。看看這裡面到底是怎麼玩的。

二:探索原理

1:探索葉子節點

剛才也說了,聚集索引玩的就是B樹,既然是B樹,那就有葉子節點和分支節點,專業術語就是度為0的為葉子節點,度>0的叫做分支節點。

我想你也聽說了,聚集索引是將索引列數據進行排序後放入B樹,那為了讓你眼見為實,我先建立一個ID無序的3條記錄。

復制代碼代碼如下:

dbcc traceon(3604)

dbcc page(Ctrip,1,120,1)

然後我用dbcc ind 命令查看下3條記錄在哪個數據頁中,如圖:

如何理解Sql Server中的聚集索引

從圖中可以看到,我的三條記錄是放在148號數據頁中的,然後我導出148號數據頁,看看內容是什麼。

復制代碼代碼如下:

dbcc traceon(3604)

dbcc page(Ctrip,1,173,1)

如何理解Sql Server中的聚集索引

從上圖中,我們看到了”數據頁“中的各個槽位的指向是按照表中的實際存儲記錄來的,好了,下面我創建個聚集索引,看看實際數據是不是真的有序了?

復制代碼代碼如下:

create clustered index Ctrip_idx_ID on Person(ID)

如何理解Sql Server中的聚集索引

不過在這裡有個有趣的問題,我的148號”表數據頁“哪去了?也是夠奇葩的,換來的確實173號索引頁,那為了保證數據完整性,應該是把148號數據頁的內容灌到173索引頁裡面去了吧?沒關系,驗證一下。

復制代碼代碼如下:

dbcc traceon(3604)

dbcc page(Ctrip,1,173,1)

如何理解Sql Server中的聚集索引

通過上面的圖,有沒有直觀的感覺到? 數據現在已經是aaaaa,bbbbb,ccccc的模式了。有序啦。同時索引頁中也保存了148號數據

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

如何理解Sql Server中的聚集索引

到此為止,我想你對葉子節點的內容有了個大概的認識,起碼沒有讓你死記硬背了。

2 :探索分支節點

為了讓你看到分支節點,我得多灌一些數據進去,好歹要讓數據撐破一個索引數據頁,這樣分支節點索引數據頁就出來了,看下面的例子:

如何理解Sql Server中的聚集索引

從圖中可以看到,當我插入1000條數據的時候,已經出現了一個分支節點(120號索引數據頁),三個葉子節點(173,121,126),葉子

節點的數據頁內容我也說過了,現在我很好奇”分支節點“中保存著什麼內容???我好興奮,我要導出120號索引數據頁了。

復制代碼代碼如下:

dbcc traceon(3604)

dbcc page(Ctrip,1,120,1)

如何理解Sql Server中的聚集索引

簡單分析下slot0:06000000 00ad0000 000100 的內容

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

ad000000:葉子索引頁的頁號,轉換為十進制就是173。

0100:葉子索引頁的文件號,轉換為十進制就是1.

不過通過分析,我們看到了,其實分支節點中保存著有兩個值,一個childpage的minkey,一個childpage的pageid,同理,其他的槽位也是這樣。

我們換個參數命令,讓結果更直觀點,記錄中就是保存著”pageID“和”minKey“。

如何理解Sql Server中的聚集索引

這樣的話,我腦海中就有一張圖出來了,不知道你現在是否有了?

如何理解Sql Server中的聚集索引

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

也許對sqlserver團隊來說,只要判斷小於449的話就直接去(1:173)數據頁,小於889的直接去(1:121)數據頁就可以啦!

以上就是精品為大家提供的如何理解Sql Server中的聚集索引的知識,希望對大家有幫助。

copyright © 萬盛學電腦網 all rights reserved