一、非聚集索引維護
非聚集索引的行定位器值保持相同的聚集索引值,即使該聚集索引列物理上重新定位後,也是如此。
為了優化這個維護開銷,SQL Server新增一個指向舊資料頁的指標,以在頁面分割之後指向新的資料頁面,而不是更新所有相關非聚集索引的行定位器。這樣,雖然降低了非聚集索引的維護開銷,但是增加了從非聚集索引行到資料行的導航開銷,因為新增了一箇舊資料頁面和信資料頁面之間的連線。因此,將聚集索引作為行定位器降低了非聚集索引相關的開銷。
二、定義書籤查詢
當一個查詢請求不是優化器選擇的非聚集索引一部分的列時,需要一個查詢。這對一個聚集索引來說是一個關鍵字查詢,堆堆表來說是一個RID查詢。這些查詢的統稱來自於舊的定義名 - 書籤查詢。這種查詢根據非聚集索引的行定位器值,從表中讀取對應的資料行,除了索引頁面上的邏輯讀操作意外,還需要一個資料頁面上的邏輯讀。但是,如果查詢需要的列在索引中,那麼就不需要訪問資料頁面。這被稱為覆蓋索引。
這些書籤查詢是大結果集最好使用聚集索引的原因。聚集索引不需要書籤查詢,因為葉子頁面就是資料頁面。
三、非聚集索引的建議
因為表只能有一個聚集索引,所以可以使用多個非聚集索引的靈活性來幫助改進效能。下面將說明非聚集索引使用的決定因素。
1、何時使用非聚集索引
非聚集索引在需要從一個大表上讀取少量的行的時候最有用,隨著需要檢索的行數量的增加,書籤查詢的開銷成比例增加。為了從表中檢索少量的行,索引列應該有很高的選擇性。
適合使用非聚集索引的情況:
- 列具有高選擇性;
- 根據列獲取少量資料;
- 窄列;
- 列經常被分組排序;
下面給出不適合建立聚集索引,但也能夠使用聚集索引的情況
- 頻繁更新的列;
- 寬型別列;
聚集索引頻繁更新是非常消耗資源的,因為會影響表的順序,同時也影響到其他索引,在頻繁更新的列上的非聚集索引的開銷不像聚集索引那麼大。在非聚集索引上的更新操作被限定在基本表和非聚集索引上,它不影響表上的其他非聚集索引。
寬型別列也類似,非聚集索引列上使用寬型別,雖影響比如聚集索引那麼大,但是也要小心使用。
2、何時不使用聚集索引
非聚集索引不適合於大量行的查詢。這樣的查詢使用聚集索引更好,聚集索引不需要大量的書籤查詢,而非聚集索除了在索引列上檢索的邏輯讀外,書籤查詢也需要消耗太多資源。SQL Server查詢優化器在檢索大結果集時會考慮這一開銷,並相應地放棄該非聚集索引。
不適合建非聚集索引的情況:
獲取大量資料;
低選擇性;