1. 程式人生 > >SQL 索引 include 介紹(轉)

SQL 索引 include 介紹(轉)

5.3.1 使用索引INCLUDE

在這個技巧中,將展示如何在非聚集索引中包含非鍵列。覆蓋查詢(covering query)是指其引用的所有列均能在非聚集索引中找到的查詢。這個方案經常會帶來出眾的查詢效能,因為SQL Server不需要從聚集索引或堆中檢索實際的資料--它只需要讀取在非聚集索引中儲存的資料。但是它的缺點是最多隻能包含16列或900位元組的索引鍵。

這個問題的一個解決方案是新引入的關鍵字INCLUDE,它允許新增最多1 023個非鍵列到非聚集索引,通過建立覆蓋索引幫助提升查詢效能。這些非鍵列沒有儲存在索引的所有級別上,而只是存在於非聚集索引的葉級別上。

使用INCLUDE的CREATE NONCLUSTERED INDEX的語法如下:

CREATE NONCLUSTERED INDEX index_name ON table_or_view_name ( column [ ASC | DESC ] [ ,...n ] ) INCLUDE ( column [ ,... n ] ) 第一個列列表是鍵索引列,在INCLUDE之後的列列表是非鍵列。在這個示例中,將新的大型物件資料型別列新增到TerminationReason表中。刪除並重建在DepartmentID上的既有索引,這次新增新的非鍵值到索引中:

ALTER TABLE HumanResources.TerminationReason  ADD LegalDescription varchar(max)   DROP INDEX HumanResources.TerminationReason.NI_TerminationReason_TerminationReason_DepartmentID   CREATE NONCLUSTERED INDEX NI_TerminationReason_TerminationReason_DepartmentID  ON HumanResources.TerminationReason (TerminationReason, DepartmentID)  INCLUDE (LegalDescription)
解析

這個技巧演示了增強非聚集索引有效性的新技術。示例從建立新的varchar(max)資料型別列開始。因為它的資料型別,不可以在索引中將它當作鍵值來使用,但在關鍵字INCLUDE中使用它將允許你引用新的大型物件資料型別。然後使用INCLUDE和新的非鍵列刪除並重建表TerminationReason上的既有索引。

只可以對非聚集索引使用INCLUDE(在覆蓋查詢上派得上用場),並且仍然不可以包含廢棄的image、ntext以及text資料型別。如果額外的非鍵值使索引大小增長得太顯著,你可能會損失一些覆蓋查詢可以給予的查詢效能,因此要確認測試比較之前和之後的效能。