存储过程的固定查询计划

Lim*_*nka 6 sql-server hints execution-plan

我正在探索计划指南主题。听起来很简单,就我们通过文档中的示例而言。

问题是我找不到任何工作示例(我也没有设法自己弄清楚)来为存储过程或过程中的语句设置固定计划。

我已经阅读了很多博客文章,但它们都只是从 microsoft docs 复制/粘贴示例。

有人更有创意/经验丰富吗?

spa*_*dba 4

以下是使用计划指南强制为过程内的语句制定计划的示例:

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)