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