使用計劃指南指定查詢引數化行為
當 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中使用explain查詢SQL的執行計劃MySqlAI
- 執行計劃-6:推入子查詢
- 使用GraphQL查詢引數來設計強大的APIAPI
- PostgreSQL並行查詢相關配置引數SQL並行
- TiDB 查詢優化及調優系列(四)查詢執行計劃的調整及優化原理TiDB優化
- 2.6 指定初始化引數
- TiDB 查詢優化及調優系列(二)TiDB 查詢計劃簡介TiDB優化
- MySQL查詢優化之優化器工作流程以及優化的執行計劃生成MySql優化
- 使用 C# 9 的records作為強型別ID - 路由和查詢引數C#型別路由
- [oracle] 查詢歷史會話、歷史執行計劃Oracle會話
- jmeter使用csv進行引數化(一)JMeter
- jmeter使用csv進行引數化(二)JMeter
- 如何實現引數級聯查詢
- Microsoft Graph for Office 365 - 查詢引數(二)ROS
- Microsoft Graph for Office 365 - 查詢引數(一)ROS
- 超引數最佳化完整指南
- Oracle 查詢行數很少,為什麼不走索引?Oracle索引
- Laravel同時接收路由引數和查詢字串中的引數Laravel路由字串
- 通過行為引數化傳遞程式碼
- Golang:go-querystring將struct編碼為URL查詢引數的庫GolangStruct
- 【讀書筆記】《PostgreSQL指南-內幕探索》-3.3建立單表查詢的計劃樹筆記SQL
- 五分鐘學習 Java 8 行為引數化Java
- 【線上直播】Paper Reading | 基於學習的引數化查詢最佳化方法
- pg中與執行計劃相關的配置(ENABLE_*)引數
- Django框架:8、聚合查詢、分組查詢、F與Q查詢、ORM查詢最佳化、ORM事務操作、ORM常用欄位型別、ORM常用欄位引數Django框架ORM型別
- 谷歌收錄查詢工具,告訴你谷歌收錄查詢工具使用指南谷歌
- 【Redis技術專區】「最佳化案例」談談使用Redis慢查詢日誌以及Redis慢查詢分析指南Redis
- 分析執行計劃優化SQLORACLE的執行計劃(轉)優化SQLOracle
- js去除url中指定引數JS
- MySQL: 使用explain 優化查詢效能MySqlAI優化
- 3.1.2 啟動時指定資料庫初始化引數資料庫
- PostgreSQL 查詢當前執行中sql的執行計劃——pg_show_plans模組SQL
- 查詢指定使用者的unique,primary索引名/鍵值索引
- 模型聯合查詢返回指定欄位模型
- Camstar Protal Studio 使用引數查資料
- PostgreSQL執行計劃變化SQL