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 ;

私の印象では、最初の「実行」は 2 つの単一の実行計画ではなく複合実行計画を生成し、それによって最初の実行で生成された実行計画を再利用する 2 番目の「実行」を無効にします。

私は正しいですか?

4

1 に答える 1

1

はい、あなたが正しい。実行計画の 2 番目の部分を再利用するには、最初のステートメントを 2 つの個別の実行計画に分割する必要があります。これを行うには、個別のMSSqlCommand.Execute呼び出しでそれらを実行するか、1 つのクエリで 2 つの呼び出しを使用しsp_executesqlます (これにより、1 レベルの間接化が追加されます)。次のようになります (疑似コード):

MSSqlCommand.Execute('exec sp_executesql stmt1; exec sp_executesql stmt2");
于 2010-01-22T10:01:35.393 に答える