解析檢視上的索引

對於任何索引,只有在查詢最佳化工具認為有所助益時,SQL Server 才會選擇在其查詢計畫中使用索引檢視。

可以在任何版本的 SQL Server 建立索引檢視。在 SQL Server Enterprise 中,查詢最佳化工具會自動考量索引檢視表。若要在所有其他版本中使用索引檢視,就必須使用 NOEXPAND 資料表提示。

SQL Server 查詢最佳化工具會在符合下列條件時使用索引檢視:

  • 下列工作階段選項是設為 ON:

    • ANSI_NULLS

    • ANSI_PADDING

    • ANSI_WARNINGS

    • ARITHABORT

    • CONCAT_NULL_YIELDS_NULL

    • QUOTED_IDENTIFIER

    • NUMERIC_ROUNDABORT 工作階段選項是設為 OFF。

  • 查詢最佳化工具會從檢視索引資料行與查詢中的元素之間找出相符之處,例如:

    • 位於 WHERE 子句中的搜尋條件述詞

    • 聯結作業

    • 彙總函數

    • GROUP BY 子句

    • 資料表參考

  • 使用索引時的預估成本,擁有最佳化工具所考量的任何存取機制成本的最低值。

  • 在對應於索引檢視中之資料表參考的查詢中,每個參考的資料表 (直接參考,或藉由展開檢視以存取其基礎資料表) 都必須在查詢中套用同一組提示。

    [!附註]

    無論目前的交易隔離等級為何,在此內容中 READCOMMITTED 和 READCOMMITTEDLOCK 提示永遠會視為不同的提示。

除了 SET 選項與資料表提示的需求以外,這些也是查詢最佳化工具用來判斷資料表索引是否涵蓋查詢的相同規則。不需在查詢中指定其他項目,即可使用索引檢視。

查詢並不一定要在 FROM 子句中明確參考索引檢視,才能讓最佳化工具使用索引檢視。如果查詢中包含了基底資料表中的資料行的參考,而這些資料行也同時出現於索引檢視中,且最佳化工具的估計結果是使用索引檢視提供最低成本的存取機制,那麼最佳化工具便選擇索引檢視,這和查詢中並未直接參考基底資料表的索引時,最佳化工具選擇這些索引的方式類似。當檢視包含查詢所未參考到的資料行,只要檢視針對涵蓋在查詢中所指定的一或多個資料行提供最低的成本選項,最佳化工具可能就會選擇該檢視。

最佳化工具會將 FROM 子句中所參考的索引檢視視為標準檢視。在最佳化程序開始時,查詢最佳化工具會將檢視的定義擴充到查詢中。接著,會執行索引檢視比對。索引檢視可用在最佳化工具所選取的最終執行計畫中,或者,此計畫可存取檢視所參考的基底資料表,藉以從檢視具體化必要的資料。最佳化工具會選擇成本最低的方式。

搭配索引檢視使用提示

您可以使用 EXPAND VIEWS 查詢提示以防止在查詢中使用檢視索引,或者可以使用 NOEXPAND 資料表提示,以針對查詢的 FROM 子句所指定的索引檢視強制使用索引。然而,您應該讓查詢最佳化工具動態判斷每個查詢最適用的存取方法。僅限在測試顯示出效能大幅改善的特定情況下,才使用 EXPAND 和 NOEXPAND。

EXPAND VIEWS 選項可指定查詢最佳化工具在整個查詢中不使用任何檢視索引。

已對某個檢視指定 NOEXPAND 時,查詢最佳化工具便會考慮使用檢視中所定義的任何索引。搭配選擇性的 INDEX() 子句指定 NOEXPAND,將會強制最佳化工具使用指定的索引。NOEXPAND 只能指定給索引檢視,且不得指定給尚未建立索引的檢視。

未在含有檢視的查詢中指定 NOEXPAND 或 EXPAND VIEWS 時,則會展開檢視以存取基礎資料表。若構成檢視的查詢中含有任何資料表提示,這些提示便會傳播到基礎資料表。(此程序在<檢視解析>中有較為詳盡的說明。)只要檢視的基礎資料表上所存在的多個提示彼此相同,則查詢即可與索引檢視比對。這些提示大多會彼此相符,因為它們都直接繼承自檢視。然而,若查詢參考資料表 (而非檢視) 以及直接套用於這些資料表的提示不相同,這種查詢將無法與索引檢視進行比對。若在檢視展開後,INDEX、PAGLOCK、ROWLOCK、TABLOCKX、UPDLOCK 或 XLOCK 提示套用到查詢中所參考的資料表,則查詢就無法與索引檢視進行比對。

若有 INDEX (index_val[ ,...n] ) 格式的資料表提示參考查詢中的檢視,且您也未指定 NOEXPAND 提示,則會忽略索引提示。若要指定使用特定的索引,請使用 NOEXPAND。

一般而言,當查詢最佳化工具將索引檢視比對到查詢時,資料表上指定的任何提示或查詢中的檢視,都會直接套用到索引檢視。若查詢最佳化工具選擇不使用索引檢視,則所有提示都會直接傳播到檢視中所參考的資料表。如需詳細資訊,請參閱<檢視解析>。這種傳播方式不適用於聯結提示。只會套用在查詢中的原始位置。將查詢比對到索引檢視時,查詢最佳化工具不會考慮使用聯結提示。若查詢計畫所使用的索引檢視符合含有聯結提示的部份查詢,則計畫中不會使用此聯結提示。

SQL Server 2008 中的索引檢視定義不允許有提示。在 80 與更新版本的相容性模式下,SQL Server 在維護索引檢視定義時,或在執行使用索引檢視的查詢時,都會忽略定義中的提示。雖然在 80 相容性模式下使用索引檢視定義中的提示並不會產生語法錯誤,但這些提示還是會被忽略。