SQL聚簇索引與非聚簇索引的本質區(qū)別
SQL聚簇索引的順序就是數(shù)據(jù)的物理存儲順序,那么,SQL聚簇索引與非聚簇索引的本質區(qū)別,究竟在哪里呢?
現(xiàn)在討論SQL聚簇索引與非聚簇索引的本質區(qū)別。正如本文最前面的兩個圖所示,聚簇索引的葉節(jié)點就是數(shù)據(jù)節(jié)點,而非聚簇索引的頁節(jié)點仍然是索引檢點,并保留一個鏈接指向對應數(shù)據(jù)塊。
還是通過一道數(shù)學題來看看它們的區(qū)別吧:假設有一8000條記錄的表,表中每條記錄在磁盤上占用1000字節(jié),如果在一個10字節(jié)長的字段上建立非聚簇索引主鍵,需要二叉樹節(jié)點16000個(這16000個節(jié)點中有8000個葉節(jié)點,每個頁節(jié)點都指向一個數(shù)據(jù)記錄),這樣數(shù)據(jù)將占用8000條×1000字節(jié)/8K字節(jié)=1000個頁面;索引將占用16000個節(jié)點×10字節(jié)/8K字節(jié)=20個頁面,共計1020個頁面。
同樣一張表,如果我們在對應字段上建立SQL聚簇索引主鍵,由于SQL聚簇索引的頁節(jié)點就是數(shù)據(jù)節(jié)點,所以索引節(jié)點僅有8000個,占用10個頁面,數(shù)據(jù)仍然占有1000個頁面。
下面我們看看在執(zhí)行插入操作時,非聚簇索引的主鍵為什么比聚簇索引主鍵要快。主鍵約束要求主鍵不能出現(xiàn)重復,那么SQL Server是怎么知道不出現(xiàn)重復的呢?唯一的方法就是檢索。對于非聚簇索引,只需要檢索20個頁面中的16000個節(jié)點就知道是否有重復,因為所有主鍵鍵值在這16000個索引節(jié)點中都包含了。但對于聚簇索引,索引節(jié)點僅僅包含了8000個中間節(jié)點,至于會不會出現(xiàn)重復必須檢索另外1000個頁數(shù)據(jù)節(jié)點才知道,那么相當于檢索10+1000=1010個頁面才知道是否有重復。所以聚簇索引主鍵的插入速度要比非聚簇索引主鍵的插入速度慢很多。
讓我們再來看看數(shù)據(jù)檢索的效率,如果對上述兩表進行檢索,在使用索引的情況下(有些時候SQL Server執(zhí)行計劃會選擇不使用索引,不過我們這里姑且假設一定使用索引),對于SQL聚簇索引檢索,我們可能會訪問10個索引頁面外加1000個數(shù)據(jù)頁面得到結果(實際情況要比這個好),而對于非聚簇索引,系統(tǒng)會從20個頁面中找到符合條件的節(jié)點,再映射到1000個數(shù)據(jù)頁面上(這也是最糟糕的情況),比較一下,一個訪問了1010個頁面而另一個訪問了1020個頁面,可見檢索效率差異并不是很大。所以不管非聚簇索引也好還是聚簇索引也好,都適合排序,聚簇索引僅僅比非聚簇索引快一點。
【編輯推薦】