非彙集索引的行定位器值保持相同的彙集索引值,即便該彙集索引列物理上從新定位後,也是如此。post
爲了優化這個維護開銷,SQL Server添加一個指向舊數據頁的指針,以在頁面分割以後指向新的數據頁面,而不是更新全部相關非彙集索引的行定位器。這樣,雖然下降了非彙集索引的維護開銷,可是增長了從非彙集索引行到數據行的導航開銷,由於添加了一箇舊數據頁面和信數據頁面之間的鏈接。所以,將彙集索引做爲行定位器下降了非彙集索引相關的開銷。性能
當一個查詢請求不是優化器選擇的非彙集索引一部分的列時,須要一個查找。這對一個彙集索引來講是一個關鍵字查找,堆堆表來講是一個RID查找。這些查找的統稱來自於舊的定義名 - 書籤查找。這種查找根據非彙集索引的行定位器值,從表中讀取對應的數據行,除了索引頁面上的邏輯讀操做意外,還須要一個數據頁面上的邏輯讀。可是,若是查詢須要的列在索引中,那麼就不須要訪問數據頁面。這被稱爲覆蓋索引。優化
這些書籤查找是大結果集最好使用匯集索引的緣由。彙集索引不須要書籤查找,由於葉子頁面就是數據頁面。spa
由於表只能有一個彙集索引,因此可使用多個非彙集索引的靈活性來幫助改進性能。下面將說明非彙集索引使用的決定因素。指針
一、什麼時候使用非彙集索引blog
非彙集索引在須要從一個大表上讀取少許的行的時候最有用,隨着須要檢索的行數量的增長,書籤查找的開銷成比例增長。爲了從表中檢索少許的行,索引列應該有很高的選擇性。排序
適合使用非彙集索引的狀況:索引
下面給出不適合創建彙集索引,但也可以使用匯集索引的狀況資源
彙集索引頻繁更新是很是消耗資源的,由於會影響表的順序,同時也影響到其餘索引,在頻繁更新的列上的非彙集索引的開銷不像彙集索引那麼大。在非彙集索引上的更新操做被限定在基本表和非彙集索引上,它不影響表上的其餘非彙集索引。class
寬類型列也相似,非彙集索引列上使用寬類型,雖影響好比彙集索引那麼大,可是也要當心使用。
二、什麼時候不使用匯集索引
非彙集索引不適合於大量行的查詢。這樣的查詢使用匯集索引更好,彙集索引不須要大量的書籤查找,而非彙集索除了在索引列上檢索的邏輯讀外,書籤查找也須要消耗太多資源。SQL Server查詢優化器在檢索大結果集時會考慮這一開銷,並相應地放棄該非彙集索引。
不適合建非彙集索引的狀況:獲取大量數據;低選擇性;