在數(shù)中導航SQL Server中的索引以B樹結(jié)構(gòu)存儲。在理論上,在B樹分叉的每一個方向上,總是有一半的剩余信息。下面來看一下聚集索引的B樹圖示
可以看出,它實際上與一般的B樹是一樣的。在這里進行的是范圍搜索(有時聚集索引尤其擅長此類事情)。搜索158—400的數(shù)字,只需要按照如下步驟進行:導航到第一條記錄,并包含該頁中所有的其余記錄(之所以知道需要該頁中其余的記錄,是因為我們從上一級節(jié)點的信息中得到還需要來自其它頁中的數(shù)據(jù)。因為這是一個有序的列表,所喲可以確定它是連續(xù)的),這意味著如果下一頁中有需要包含進來的記錄,那么本頁中其余的記錄必定都要包含進來。我們可以開始從這些頁中提取記錄,而不需要完成確認方面的工作。我們從導航節(jié)點開始。SQL Server可以基于一個保存為系統(tǒng)表的條目定位跟節(jié)點??梢酝ㄟ^查詢sys.indexes查看那個表的邏輯內(nèi)容。
注意:數(shù)據(jù)庫中的每一個索引在sys.indexes中都有一個條目。系統(tǒng)視圖是數(shù)據(jù)庫的一部分(與主數(shù)據(jù)庫中相反)而且會顯示數(shù)據(jù)庫中所有索引的存儲位置信息,以及它們基于那個列。在版本較舊的SQL Server中??梢圆樵兓A(chǔ)表(在技術(shù)上你可以這么做,不過本人強烈推薦你不要直接查詢),即所謂的sysindexes表。
瀏覽作為根節(jié)點的頁,可以知道接下來要檢查的頁是什么(正如圖中所顯示,我們要查看第二級的第二頁)。然后,繼續(xù)處理。隨著我們沿著樹一步步向下,將得到越來越小的數(shù)據(jù)子集。最終,我們會到達索引級別的葉級。在聚集索引中,到達索引的葉級意味這也到達了要找尋的行和要找尋的數(shù)據(jù)。
注意:關(guān)于區(qū)別重要性,我已經(jīng)強調(diào)過很多了。有了聚集索引,在完整瀏覽索引的時候就已經(jīng)完整地瀏覽了自己的數(shù)據(jù)。早你觀察非聚集索引的時候會發(fā)現(xiàn)這樣做對性能的影響差別有多大——特別是在聚集索引上建立非聚集索引的時候。
2堆上的非聚集索引堆上的非聚集索引在各方面都與聚集索引的作用方式很類似。不過它們確實有幾個顯著的區(qū)別:葉級不是數(shù)據(jù),而是你可以獲得數(shù)據(jù)指針的級別。指針以索引指向的特定行的行標識符(RID)的形式出現(xiàn),對于RID大家都應該有所了解,它由索引指向特定行的區(qū)段、頁和行偏移量組成。盡管葉級并非真正的數(shù)據(jù)(而是具有RID)。不過,這里只比使用聚集索引多了一步而已——因為RID包含行位置的完整信息,因而可以直接訪問數(shù)據(jù)。