SQL Server索引管理——索引創建建議和經驗(三)

SQL Server索引管理——索引創建建議和經驗(三)

非聚集索引

非聚集索引不影響數據在表頁中的順序,因爲非聚集索引的葉頁和表的數據頁是獨立的。需要行定位符從索引行導航到數據行。行定位器的結構決定於數據是以堆的形式存儲還是以聚集索引的形式存儲。數據以堆形式存儲,RID爲行定位器;一個有聚集索引的表,行定位器爲聚集索引鍵。

非聚集索引的維護

非聚集索引的行定位器繼續的使用相同的聚集索引鍵值,即使聚集索引行的物理重排。

爲優化這個維護消耗,SQL Server在原數據頁增加了一個指向頁拆分後新頁的指針,而不是更新所有相關非聚集索引的行定位器。儘管這樣減少了維護非聚集索引的消耗,其增加了從非聚集索引導航到數據頁的消耗,因爲增加了新頁到舊頁的鏈接。因此,擁有聚集索引行定位器降低了關聯非聚集索引的負載。

書籤查找定義

當一個查詢需要的列不是優化器選擇的非聚集索引的部分列時,就需要查找了。對於聚集索引,被稱爲鍵查找(key lookup),對於堆,則爲RID查找。這些查找的通用術語爲書籤查找(bookmark lookup)。查找是從根據索引行的行定位器找到表中的數據行,需要對數據行進行邏輯讀,而不是索引頁的邏輯讀。然而,如果所有需要的列都包含在索引中,那麼就不需要從數據頁中讀取數據了。這被稱爲覆蓋索引。

書籤查找是大的結果集最好有聚集索引的原因。聚集索引不需要書籤查找,因爲聚集索引的葉頁和數據頁相同。

非聚集索引的建議

因爲表只能有一個聚集索引,你可以使用多個非聚集索引幫助改進性能。我將在下面介紹決定使用非聚集索引的因素。

何時使用非聚集索引

當你想要從一個大表中檢索少量數據行是,非聚集索引是最有用的。隨着檢索的行數增多,書籤查找的總開銷相應增長。爲從小表中檢索少量數據行,索引列必須具有較高的選擇性(selectivity)。

進一步,不適合聚集索引的列

  • 頻繁更新的列

  • 寬鍵列

這些情況可以使用非聚集索引,因爲,和聚集索引不同,它不影響表中的其他索引。在頻繁更新列上的非聚集索引,和在該列上創建聚集索引的消耗不同。在非聚集索引上的更新操作僅限於基表和這個非聚集索引。它不影響表上的其他索引。類似的,在寬列上的非聚集索引,和聚集索引不同,也不會增加其他索引的大小。然而,仍然保持謹慎,對在高度更新或寬列(列集)上創建非聚集索引也是如此,因爲這將增加查詢活動的消耗。

何時不適應非聚集索引

非聚集索引那種查詢大量行數據的語句。這種查詢最好使用聚集索引,其不需要獨立書籤查找檢索數據行。除非使用覆蓋索引。

聚集索引 VS 非聚集索引

選擇聚集索引還是非聚集索引的主要影響因素如下:

  • 被檢索的數據行

  • 數據的排序需求

  • 索引鍵寬度

  • 列的更新頻率

  • 書籤消耗

  • 磁盤熱點

如果喜歡,可以搜索關注 MSSQLServer 公衆號,將有更多精彩內容分享:

                                                                 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章