考虑以下“代码”
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 ;
我的印象是第一个“执行”生成复合执行计划而不是两个单一执行计划,从而禁用第二个“执行”重用第一个执行中生成的任何执行计划。
我是对的吗?
答案 0 :(得分:1)
是的,你是对的。要重用执行计划的第二部分,您需要将第一个语句拆分为两个单独的执行计划。您可以通过使用单独的MSSqlCommand.Execute
调用执行它们,或者在一个查询中使用两个sp_executesql
调用来执行此操作(这会增加一个间接级别)。它看起来像这样(伪代码):
MSSqlCommand.Execute('exec sp_executesql stmt1; exec sp_executesql stmt2");