如何在MS SQL Server中获取查询计划重用

时间:2017-07-19 14:54:04

标签: sql-server sql-execution-plan sp-executesql

我继承了一个包含大约450个查询的表的数据库应用程序。有一个调用过程将@QueryId@TheId作为输入参数。执行这些查询的唯一方法是通过此过程。查询是这样的:

@sql = replace('insert into #temp select col1, col2, col3, col4
from SomeTable st join OtherTable ot on matching_column
where st.TheID = ##TheId##', '##TheId##', @TheId);

exec sp_executesql @sql;

我想让计划重用,所以我将##TheId##替换为@TheId,然后像这样执行查询:

exec sp_executesql @sql, N'@TheId int', @TheId;

但是,我仍然看到相同的行为,即每个计划都是一个独特的计划,即使@sql字符串已经编译并且在过程缓存中。

现在字符串就像这样

...where where st.TheID = @TheId

问题:如何根据需要在参数化查询中获得计划重用?

2 个答案:

答案 0 :(得分:1)

您是否尝试在不使用动态查询的情况下创建存储过程?

尝试以下几行:

CREATE PROCEDURE insertdata 
(
    @TheId INT -- or whatever data type is being used
)   
AS
BEGIN 
    INSERT INTO #temp 
    SELECT 
        col1
        , col2
        , col3
        , col4
    FROM SomeTable st 
    JOIN OtherTable ot ON matching_column
    WHERE st.TheID = @Theid;
END

如果您想执行它,您只需执行以下操作:

EXEC insertdata 123;

答案 1 :(得分:1)

如果您将其修改为以下内容,您应该重新使用计划,因为这将使其成为参数化查询:

@sql = replace('insert into #temp select col1, col2, col3, col4
from SomeTable st join OtherTable ot on matching_column
where st.TheID = ##TheId##', '##TheId##', '@TheId');

exec sp_executesql @sql, N'@TheID INT', @TheID;

https://technet.microsoft.com/en-us/library/ms175580(v=sql.105).aspx