SQL Server索引 - 非彙集索引 <第七篇>

1、非彙集索引維護

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

  爲了優化這個維護開銷,SQL Server添加一個指向舊數據頁的指針,以在頁面分割以後指向新的數據頁面,而不是更新全部相關非彙集索引的行定位器。這樣,雖然下降了非彙集索引的維護開銷,可是增長了從非彙集索引行到數據行的導航開銷,由於添加了一箇舊數據頁面和信數據頁面之間的鏈接。所以,將彙集索引做爲行定位器下降了非彙集索引相關的開銷。性能

2、定義書籤查找

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

  這些書籤查找是大結果集最好使用匯集索引的緣由。彙集索引不須要書籤查找,由於葉子頁面就是數據頁面。spa

3、非彙集索引的建議

  由於表只能有一個彙集索引,因此可使用多個非彙集索引的靈活性來幫助改進性能。下面將說明非彙集索引使用的決定因素。指針

  一、什麼時候使用非彙集索引blog

  非彙集索引在須要從一個大表上讀取少許的行的時候最有用,隨着須要檢索的行數量的增長,書籤查找的開銷成比例增長。爲了從表中檢索少許的行,索引列應該有很高的選擇性。排序

  適合使用非彙集索引的狀況:索引

  • 列具備高選擇性;
  • 根據列獲取少許數據;
  • 窄列;
  • 列常常被分組排序;

  下面給出不適合創建彙集索引,但也可以使用匯集索引的狀況資源

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

  彙集索引頻繁更新是很是消耗資源的,由於會影響表的順序,同時也影響到其餘索引,在頻繁更新的列上的非彙集索引的開銷不像彙集索引那麼大。在非彙集索引上的更新操做被限定在基本表和非彙集索引上,它不影響表上的其餘非彙集索引。class

  寬類型列也相似,非彙集索引列上使用寬類型,雖影響好比彙集索引那麼大,可是也要當心使用。

  二、什麼時候不使用匯集索引

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

不適合建非彙集索引的狀況:獲取大量數據;低選擇性;

相關文章
相關標籤/搜索