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

내 인상은 첫 번째는 "실행"이다 대신 복합 실행 계획을 생성 두 개의 "Execute"를 비활성화하여 첫 번째 Execute에서 생성 된 모든 실행 계획을 재사용합니다.

맞습니까?

답변

1

네, 맞습니다. 실행 계획의 두 번째 부분을 다시 사용하려면 첫 번째 문을 두 개의 개별 실행 계획으로 분할해야합니다. 별도의 MSSqlCommand.Execute 호출로 실행하거나 sp_executesql에 대한 두 번의 호출을 사용하여 하나의 쿼리에서이 작업을 수행 할 수 있습니다 (이것은 간접 참조의 한 수준을 추가 함). 다음과 같이 보일 것입니다 (의사 코드에서) :

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