2010-01-22 78 views
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 ; 

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

我对不对?

回答

1

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

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