2010-01-22 95 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");