以下のようなクエリを実行してみます。
DECLARE @tmp char(500) SELECT @tmp = Col1 FROM [dbo].TempDBTest ORDER BY Col1 DESC OPTION (MAXDOP 0) GO
実行プランからは複数のスレッドによる並列クエリとして実行されていることが確認できます。
実行中のセッションについて、この確認を実行プラン以外から確認する方法を。
並列クエリとして実行されている操作については、複数の実行コンテキストが使用されて動作しています。
各セッションの実行コンテキストは sys.dm_os_tasks / sys.dm_os_waiting_tasks から確認することができます。
複数のスレッドが使用されている場合、セッションで生成されている exec_context_id が複数存在しています。
そのため、以下のようなクエリを実行することで、複数の実行コンテキストが使用されていることが確認できます。
select * from sys.dm_os_tasks where session_id =68 order by session_id,exec_context_id select * from sys.dm_os_waiting_tasks where session_id = 68 order by session_id,exec_context_id
MAXDOP を 1 にした場合は以下のような結果となります。
以下のようなクエリを実行することで、実行中のセッションに対して、複数スレッドで実行されているクエリのプランを取得できるかと。
SELECT ot.session_id,COUNT(*) AS exec_context_count, (SELECT query_plan FROM sys.dm_exec_query_plan(er.plan_handle)) AS query_plan FROM sys.dm_os_tasks ot LEFT JOIN sys.dm_exec_requests er ON er.session_id = ot.session_id WHERE ot.session_id >= 50 GROUP BY ot.session_id, plan_handle HAVING COUNT(*) > 1
SQL Server の技術情報を整理していて、そういえばこういう見方もあったな~と思いメモとして。