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



我继承了一个数据库应用程序,该应用程序有一个包含大约 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

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

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

@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

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

尝试以下操作:

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;

相关内容

  • 没有找到相关文章

最新更新