SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

特定のセッションで実行されているクエリが複数スレッドで実行されているかを確認

leave a comment

以下のようなクエリを実行してみます。

DECLARE @tmp char(500)
SELECT @tmp = Col1 FROM [dbo].TempDBTest ORDER BY Col1 DESC OPTION (MAXDOP 0)
GO

 

この時の実行プランは以下のようになります。

image

実行プランからは複数のスレッドによる並列クエリとして実行されていることが確認できます。

実行中のセッションについて、この確認を実行プラン以外から確認する方法を。

並列クエリとして実行されている操作については、複数の実行コンテキストが使用されて動作しています。

各セッションの実行コンテキストは 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

 

image

MAXDOP を 1 にした場合は以下のような結果となります。

image

以下のようなクエリを実行することで、実行中のセッションに対して、複数スレッドで実行されているクエリのプランを取得できるかと。

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 の技術情報を整理していて、そういえばこういう見方もあったな~と思いメモとして。

Written by masayuki.ozawa

10月 22nd, 2014 at 11:09 pm

Posted in SQL Server

Tagged with

Leave a Reply

*