Повторное использование плана выполнения - PullRequest
0 голосов
/ 22 января 2010

Рассмотрим следующий «код»

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 Ответ

1 голос
/ 22 января 2010

Да, вы правы. Чтобы повторно использовать вторую часть плана выполнения, вам нужно разделить первый оператор на 2 отдельных плана выполнения. Вы можете сделать это, выполнив их с отдельными MSSqlCommand.Execute вызовами или используя два вызова sp_executesql в одном запросе (это добавляет один уровень косвенности). Это будет выглядеть примерно так (в псевдокоде):

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