SQL Server 2008將計劃指南與查詢匹配

iSQlServer發表於2008-11-26

SQL Server 將 OBJECT 型別的計劃嚮導與在 sp_create_plan_guide 儲存過程的 @module_or_batch 引數中命名的儲存過程、觸發器、或函式(模組)內出現的查詢匹配。如果計劃嚮導位於模組中,則該計劃嚮導將與指定的查詢匹配。

對於在批處理內提交的查詢,SQL Server 通過首先嚐試將查詢與基於 SQL 的計劃嚮導匹配,再嘗試引數化查詢,然後再次嘗試匹配其他查詢,直到將計劃嚮導與這些查詢匹配為止。下圖簡要介紹了這一過程。


SQL Server 查詢優化器將執行的批處理識別為編譯批處理內的每條語句的請求。

對於批處理內的特定語句,SQL Server 嘗試將該語句與基於 SQL 的計劃指南匹配,該指南的 @module_or_batch 引數與傳入批處理文字的引數匹配(包含所有常量文字值);該指南的 @stmt 引數也與批處理中的語句匹配。如果存在此類計劃指南並且匹配成功,則會修改語句文字,以包括計劃指南中指定的查詢提示。隨後將相應地編譯語句。

如果計劃嚮導與步驟 2 中的語句不匹配,則 SQL Server 將嘗試使用強制引數化來引數化該語句。在此步驟中,引數化可能由於下列任何一個原因而失敗:

該語句已經被引數化,或者包含本地變數。

應用了 PARAMETERIZATION SIMPLE 資料庫 SET 選項(預設設定),但沒有將任何 TEMPLATE 型別的計劃嚮導應用於該語句,並且沒有任何 TEMPLATE 型別的計劃嚮導指定 PARAMETERIZATION FORCED 查詢提示。

已經有 TEMPLATE 型別的計劃嚮導應用於該語句,並且指定 PARAMETERIZATION SIMPLE 查詢提示。

如果強制引數化成功,則 SQL Server 嘗試將引數化格式的該語句與對該引數化語句建立的 SQL 型別的計劃嚮導匹配。如果存在此類計劃指南並且匹配成功,則會修改語句文字,以包括計劃指南中指定的查詢提示。隨後將相應地編譯語句。如果未與此類計劃嚮導匹配,將編譯該引數化語句,而無需事先由計劃嚮導修改該語句。

如果步驟 3 中的引數化失敗,SQL Server 將再次嘗試引數化該語句。這一次,SQL Server 將應用預設的簡單引數化行為。然後,直接編譯結果查詢。計劃嚮導與簡單引數化的結果不匹配。
注意:
在應用於通過強制引數化或簡單引數化進行引數化的查詢的 SQL 型別的計劃嚮導中,將忽略 RECOMPILE 查詢提示。還會發出一條警告。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-503352/,如需轉載,請註明出處,否則將追究法律責任。

相關文章