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