执行计划重用

时间:2010-01-22 09:43:12

标签: sql sql-server reusability sql-execution-plan

考虑以下“代码”

define stmt1 = 'insert into T(a, b) values(1, 1);
define stmt2 = 'select * from T';
MSSqlCommand.Execute( stmt1;stmt2 );
MSSqlCommand.Execute( stmt2 );

使用以下方法调查缓存的查询计划:

SELECT [cp].[refcounts] 
, [cp].[usecounts] 
, [cp].[objtype] 
, [st].[dbid] 
, [st].[objectid] 
, [st].[text] 
, [qp].[query_plan] 
FROM sys.dm_exec_cached_plans cp 
CROSS APPLY sys.dm_exec_sql_text ( cp.plan_handle ) st 
CROSS APPLY sys.dm_exec_query_plan ( cp.plan_handle ) qp ;

我的印象是第一个“执行”生成复合执行计划而不是两个单一执行计划,从而禁用第二个“执行”重用第一个执行中生成的任何执行计划。

我是对的吗?

1 个答案:

答案 0 :(得分:1)

是的,你是对的。要重用执行计划的第二部分,您需要将第一个语句拆分为两个单独的执行计划。您可以通过使用单独的MSSqlCommand.Execute调用执行它们,或者在一个查询中使用两个sp_executesql调用来执行此操作(这会增加一个间接级别)。它看起来像这样(伪代码):

MSSqlCommand.Execute('exec sp_executesql stmt1; exec sp_executesql stmt2");