關於非簇索引中儲存的簇索引的RID還是指標的問題

sqysl發表於2009-06-09
昨晚遇到了阿少,這小子又換了馬甲,差點認不出,他現在正在做資料儲存這塊,也就是想自己做個儲存引擎,所以對MSSQL的儲存這塊研究的比較深入,他提出了關於非簇索引中儲存的是簇索引的RID還是指標的問題,他堅持說是儲存的一個指標,就是指向簇索引中資料的指標,我查了一晚上資料,本來這幾天事情很多,精力不集中,而且有點頭疼,索引看了很久才看到了點資訊,具體總結如下:
1、如果一個表上有兩個索引,一個是簇索引,另一個是非簇索引,那麼非簇索引中除了儲存鍵值外,還儲存簇索引的鍵值,透過非簇索引查詢資料時,要先獲取非簇的鍵值,然後獲取簇的鍵值,因為他們在非簇裡是儲存在一起的,然後透過簇索引的鍵值,在到簇索引的根節點,然後一級級的查下去,直到簇索引葉子節點的相應的資料,這樣,非簇索引裡不儲存簇索引資料行的RID,而是儲存的簇索引的鍵值,雖然在查詢簇索引的資料時多走幾個節點,然而,在維護非簇索引時可能要省不少勁,因為這牽扯到簇索引節點分裂時非簇索引的維護問題。
2、另一點讓我感到慚愧的是,雖然接觸資料庫這麼多年,基本理論也看過一點,然而對堆的理解還是那麼膚淺,甚至認為索引也是一個堆,透過和阿少討論,加深了我對堆概念的理解,所謂堆就是當一行新插入表時,需要獲取空間來容納新插入資料,那麼這個空間在堆裡任何一個地方都可以,只要能放開新插入的資料就可以,而索引不同,它必須把新插入行的鍵值插入到該插入的位置才可以,因為索引裡的鍵值的排列是有順序的。
3、此外,阿少還提到,在簇索引中,當分裂頁時,新插入行以後的所有地址即RID都要一次向後挪動,也就是都要改變RID,我的思考,不需要一次向後挪動,因為索引的頁是雙向連結串列,只需在連結串列中加入新的頁就可以了,需要改動RID的資料行只涉及到新新增到連結串列裡的頁,而其他資料頁的資料並未挪動,因此RID也並沒發生變化,但即使如此,在頁分裂時,包括分支節點和葉節點的工作量,也是比較大的,對維護費簇索引來說也是不少的開銷,尤其是對那些經常發生改變的簇索引來說。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8484829/viewspace-605584/,如需轉載,請註明出處,否則將追究法律責任。

相關文章