SQL Server索引 - 非聚集索引

weixin_33912246發表於2019-01-08

一、非聚集索引維護

  非聚集索引的行定位器值保持相同的聚集索引值,即使該聚集索引列物理上重新定位後,也是如此。

  為了優化這個維護開銷,SQL Server新增一個指向舊資料頁的指標,以在頁面分割之後指向新的資料頁面,而不是更新所有相關非聚集索引的行定位器。這樣,雖然降低了非聚集索引的維護開銷,但是增加了從非聚集索引行到資料行的導航開銷,因為新增了一箇舊資料頁面和信資料頁面之間的連線。因此,將聚集索引作為行定位器降低了非聚集索引相關的開銷。

二、定義書籤查詢

  當一個查詢請求不是優化器選擇的非聚集索引一部分的列時,需要一個查詢。這對一個聚集索引來說是一個關鍵字查詢,堆堆表來說是一個RID查詢。這些查詢的統稱來自於舊的定義名 - 書籤查詢。這種查詢根據非聚集索引的行定位器值,從表中讀取對應的資料行,除了索引頁面上的邏輯讀操作意外,還需要一個資料頁面上的邏輯讀。但是,如果查詢需要的列在索引中,那麼就不需要訪問資料頁面。這被稱為覆蓋索引。

  這些書籤查詢是大結果集最好使用聚集索引的原因。聚集索引不需要書籤查詢,因為葉子頁面就是資料頁面。

三、非聚集索引的建議

  因為表只能有一個聚集索引,所以可以使用多個非聚集索引的靈活性來幫助改進效能。下面將說明非聚集索引使用的決定因素。

  1、何時使用非聚集索引

  非聚集索引在需要從一個大表上讀取少量的行的時候最有用,隨著需要檢索的行數量的增加,書籤查詢的開銷成比例增加。為了從表中檢索少量的行,索引列應該有很高的選擇性。

  適合使用非聚集索引的情況:

  • 列具有高選擇性;
  • 根據列獲取少量資料;
  • 窄列;
  • 列經常被分組排序;

  下面給出不適合建立聚集索引,但也能夠使用聚集索引的情況

  •   頻繁更新的列;
  •   寬型別列;

  聚集索引頻繁更新是非常消耗資源的,因為會影響表的順序,同時也影響到其他索引,在頻繁更新的列上的非聚集索引的開銷不像聚集索引那麼大。在非聚集索引上的更新操作被限定在基本表和非聚集索引上,它不影響表上的其他非聚集索引。

  寬型別列也類似,非聚集索引列上使用寬型別,雖影響比如聚集索引那麼大,但是也要小心使用。

  2、何時不使用聚集索引

  非聚集索引不適合於大量行的查詢。這樣的查詢使用聚集索引更好,聚集索引不需要大量的書籤查詢,而非聚集索除了在索引列上檢索的邏輯讀外,書籤查詢也需要消耗太多資源。SQL Server查詢優化器在檢索大結果集時會考慮這一開銷,並相應地放棄該非聚集索引。

不適合建非聚集索引的情況:
獲取大量資料;
低選擇性;

 

 
 
 

相關文章