2010-01-22 12 views
0

Considérez ce qui suit "code"plan d'exécution réutilisation

define stmt1 = 'insert into T(a, b) values(1, 1); 
define stmt2 = 'select * from T'; 
MSSqlCommand.Execute(stmt1;stmt2); 
MSSqlCommand.Execute(stmt2); 

L'étude des plans de requêtes mises en cache en utilisant:

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 ; 

Mon impression est que le premier "Execute" génère un plan d'exécution composite au lieu de deux plans d'exécution singuliers, désactivant ainsi le second "Execute" réutilisant tout plan d'exécution généré dans le premier Execute.

Ai-je raison?

Répondre

1

Oui, vous avez raison. Pour réutiliser la deuxième partie du plan d'exécution, vous devez diviser la première déclaration en deux plans d'exécution distincts. Vous pouvez le faire soit en les exécutant avec MSSqlCommand.Execute appels distincts ou en utilisant deux appels à sp_executesql dans une requête (ceci ajoute un niveau d'indirection). Cela ressemblerait à ceci (en pseudocode):

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