使用計劃指南指定查詢引數化行為
當 PARAMETERIZATION 資料庫選項設定為 SIMPLE 時,SQL Server 查詢優化器可以選擇引數化查詢。這意味著查詢中包含的任何文字值都用引數來替換。此過程稱為簡單引數化。SIMPLE 引數化生效後,將無法控制引數化哪些查詢,不引數化哪些查詢。不過,您可以通過將 PARAMETERIZATION 資料庫選項設定為 FORCED 來指定引數化資料庫中的所有查詢。此過程稱為強制引數化。
可以通過下列方式使用計劃指南來覆蓋資料庫的引數化行為:
當 PARAMETERIZATION 資料庫選項設定為 SIMPLE 時,您可以指定對某一類查詢嘗試執行強制引數化。可以通過在查詢的引數化表單上建立 TEMPLATE 計劃指南並在 sp_create_plan_guide 儲存過程中指定 PARAMETERIZATION FORCED 查詢提示來完成此操作。您可以將此種計劃指南看作只對某一類查詢(而不是所有查詢)啟用強制引數化的方法。
當 PARAMETERIZATION 資料庫選項設定為 FORCED 時,您可以指定對某一類查詢僅嘗試執行簡單引數化而非強制引數化。通過在查詢的強制引數化表單上建立 TEMPLATE 計劃指南,並在 sp_create_plan_guide 中指定 PARAMETERIZATION SIMPLE 查詢提示,可以執行此操作。
請考慮 AdventureWorks 資料庫的以下查詢:
複製程式碼
SELECT pi.ProductID, SUM(pi.Quantity) AS Total
FROM Production.ProductModel AS pm
INNER JOIN Production.ProductInventory AS pi
ON pm.ProductModelID = pi.ProductID
WHERE pi.ProductID = 101
GROUP BY pi.ProductID, pi.Quantity HAVING SUM(pi.Quantity) > 50;作為資料庫管理員,您已確定不想對資料庫中的所有查詢啟用強制引數化。不過,您確實想避免所有語法上與前一個查詢相同而只是常量文字值不同的查詢的編譯開銷。換句話說,您想引數化該查詢,使此種查詢的查詢計劃可以再次使用。在此情況下,請完成下列步驟:
檢索查詢的引數化表單。獲取此值以用於 sp_create_plan_guide 的唯一安全方法是使用 sp_get_query_template 系統儲存過程。
請指定 PARAMETERIZATION FORCED 查詢提示以對查詢的引數化表單建立計劃指南。
重要提示:
作為引數化查詢的一部分,SQL Server 根據文字的值和大小,將資料型別分配給替換文字值的引數。傳遞給 sp_get_query_template 的 @stmt 輸出引數的常量文字值也發生同樣的過程。由於在 SQL Server 引數化查詢時,sp_create_plan_guide 的 @params 引數中指定的資料型別必須與此查詢中的資料型別匹配,因此您可能必須要建立多個計劃指南以涵蓋全部可能的查詢引數值。有關引數化查詢後 SQL Server 分配到引數的資料型別的資訊,請參閱強制引數化。
以下指令碼既可用於獲取引數化查詢也可用於之後對其建立計劃指南:
複製程式碼
DECLARE @stmt nvarchar(max);
DECLARE @params nvarchar(max);
EXEC sp_get_query_template
N'SELECT pi.ProductID, SUM(pi.Quantity) AS Total
FROM Production.ProductModel AS pm
INNER JOIN Production.ProductInventory AS pi ON pm.ProductModelID = pi.ProductID
WHERE pi.ProductID = 101
GROUP BY pi.ProductID, pi.Quantity
HAVING sum(pi.Quantity) > 50',
@stmt OUTPUT,
@params OUTPUT;
EXEC sp_create_plan_guide
N'TemplateGuide1',
@stmt,
N'TEMPLATE',
NULL,
@params,
N'OPTION(PARAMETERIZATION FORCED)';同樣,在已啟用強制引數化的資料庫中,可以確保按照簡單引數化規則對示例查詢以及其他語法相同但常量文字值不同的查詢進行引數化。若要實現此目的,請在 OPTION 子句中指定 PARAMETERIZATION SIMPLE 而不指定 PARAMETERIZATION FORCED。
注意:
TEMPLATE 計劃指南使語句與在僅包含單個語句的批處理中提交的查詢匹配。多語句批處理中的語句通過 TEMPLATE 計劃指南進行匹配是不合格的。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-503351/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 設計引數化查詢的計劃指南
- explain 查詢執行計劃AI
- Sql Server 的引數化查詢SQLServer
- 抽象SQL引數化查詢VK抽象SQL
- MySQL引數化查詢的IN 和 LIKEMySql
- 執行計劃-6:推入子查詢
- 在MySQL中使用explain查詢SQL的執行計劃MySqlAI
- 使用GraphQL查詢引數來設計強大的APIAPI
- 查詢初始化引數的方法(二)
- 查詢初始化引數的方法(一)
- 查詢初始化引數的方法(七)
- 查詢初始化引數的方法(六)
- 查詢初始化引數的方法(五)
- 查詢初始化引數的方法(四)
- 查詢初始化引數的方法(三)
- PostgreSQL並行查詢相關配置引數SQL並行
- mysql常用引數使用說明及查詢MySql
- TiDB 查詢優化及調優系列(四)查詢執行計劃的調整及優化原理TiDB優化
- Oracle查詢優化器的相關引數Oracle優化
- 查詢最佳化器的引數設定
- /*+ START */ 強制使用星型查詢計劃
- 查詢hadoop引數變數Hadoop變數
- 開啟查詢慢查詢日誌引數
- 透過查詢檢視sql執行計劃SQL
- SQL Server 2008將計劃指南與查詢匹配SQLServer
- 隱含引數的查詢
- 隱藏引數查詢sqlSQL
- 【執行計劃】Oracle 11gR2使用Full outer Joins執行計劃完成全外連線查詢Oracle
- MySQL查詢優化之優化器工作流程以及優化的執行計劃生成MySql優化
- MySQL中in(獨立子查詢)的執行計劃MySql
- oracle 查詢計劃中的基數cardinality概念(二)Oracle
- oracle 查詢計劃中的基數cardinality概念(一)Oracle
- 使用 C# 9 的records作為強型別ID - 路由和查詢引數C#型別路由
- TiDB 查詢優化及調優系列(二)TiDB 查詢計劃簡介TiDB優化
- Oracle隱含引數的查詢Oracle
- 執行計劃中Row 數量為0
- .NET應用架構設計—面向查詢服務的引數化查詢設計(分解業務點,單獨配置各自的資料查詢契約)應用架構
- [oracle] 查詢歷史會話、歷史執行計劃Oracle會話