0

考虑以下“代码”

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 ;

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

我对吗?

4

1 回答 1

1

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

MSSqlCommand.Execute('exec sp_executesql stmt1; exec sp_executesql stmt2");
于 2010-01-22T10:01:35.393 回答