如何在 MS SQL 服务器中重用查询计划
How to get Query Plan Reuse in MS SQL Server
我继承了一个数据库应用程序,该应用程序 table 包含大约 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
问题:如何根据需要在参数化查询中重用计划?
您是否尝试过在不使用动态查询的情况下创建存储过程?
尝试以下几行:
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;
好吧,如果您将其修改为以下内容,您应该可以重用计划,因为这将使它成为参数化查询:
@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
我继承了一个数据库应用程序,该应用程序 table 包含大约 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
问题:如何根据需要在参数化查询中重用计划?
您是否尝试过在不使用动态查询的情况下创建存储过程?
尝试以下几行:
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;
好吧,如果您将其修改为以下内容,您应该可以重用计划,因为这将使它成为参数化查询:
@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