Lim*_*nka 6 sql-server hints execution-plan
我正在探索计划指南主题。听起来很简单,就我们通过文档中的示例而言。
问题是我找不到任何工作示例(我也没有设法自己弄清楚)来为存储过程或过程中的语句设置固定计划。
我已经阅读了很多博客文章,但它们都只是从 microsoft docs 复制/粘贴示例。
有人更有创意/经验丰富吗?
以下是使用计划指南强制为过程内的语句制定计划的示例:
USE tempdb;
GO
CREATE PROCEDURE dbo.test
AS
BEGIN
SET NOCOUNT ON;
SELECT svp.name AS login_name, dbp.name AS user_name
FROM sys.database_principals AS dbp
INNER JOIN sys.server_principals AS svp
ON dbp.sid = svp.sid;
END
GO
-- Use Ctrl+M to capture the execution plan
-- You will see loop joins used
EXEC dbo.test;
Run Code Online (Sandbox Code Playgroud)
现在使用强制连接策略生成该语句的执行计划:
SELECT svp.name AS login_name, dbp.name AS user_name
FROM sys.database_principals AS dbp
INNER JOIN sys.server_principals AS svp
ON dbp.sid = svp.sid
OPTION (HASH JOIN);
Run Code Online (Sandbox Code Playgroud)
复制执行计划 XML 并将其粘贴到查询窗口。将任何出现的'(单引号) 替换为''''(四个单引号)。
sp_create_plan_guide 过程的最终参数将采用以下形式:
@xmlPlan = 'OPTION (USE PLAN N''your plan goes here'')'
Run Code Online (Sandbox Code Playgroud)
现在您可以明白为什么需要四个引号:转义一次将 XML 放入字符串文字中,转义两次将 XML 放入字符串文字中另一个字符串文字中。
确保将 XML 计划粘贴在 后面OPTION (USE PLAN N''
:任何空格或换行符都会使其无效。
DECLARE @planXML nvarchar(max) = 'OPTION (USE PLAN N''your modified XML plan here'')';
EXEC sp_create_plan_guide
@name = 'UseHash',
@stmt = 'SELECT svp.name AS login_name, dbp.name AS user_name
FROM sys.database_principals AS dbp
INNER JOIN sys.server_principals AS svp
ON dbp.sid = svp.sid;',
@type = 'OBJECT',
@module_or_batch = 'dbo.test',
@hints = @planXML
GO
-- Use Ctrl+M to capture the execution plan
-- You will see hash joins used
EXEC dbo.test;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2838 次 |
最近记录: |