web-dev-qa-db-ja.com

クエリは並行して実行されますが、単独でブロックされているように見えます

MAXDOP 8で並列実行されるクエリがあります。sp_who2同じセッションIDが異なる接続IDで数回(> 8)繰り返されているのがわかります。

以下のクエリを使用したところ、待機タイプがまだCXCONSUMER待機タイプであることがわかりました。しかし、130の異なるexec_context IDが表示されます。

SELECT 
    dot.session_id,
    dot.exec_context_id,
    dot.task_state,
    dowt.wait_type,
    dowt.wait_duration_ms,
    dowt.blocking_session_id,
    dowt.resource_description
FROM sys.dm_os_tasks dot
    LEFT JOIN sys.dm_os_waiting_tasks dowt
        ON  dowt.exec_context_id = dot.exec_context_id
            AND dowt.session_id = dot.session_id
WHERE dot.session_id = 96
ORDER BY exec_context_id;

enter image description here

クエリが並列で実行されている場合、負荷が別のワーカースレッドに分散されるときに別のspidがありますか?

ケンドラ・リトルの記事を見てみました。とても役に立ちました。

クエリを使用して、並列処理クエリで使用されているさまざまなスケジューラを確認しました。

enter image description here

同じshcheduler_id/workerアドレスが複数回使用されているのがわかりますか?

また、私のMAXDOPは4ですが、奇妙な5つの異なるscheduler_idが表示されます。

3
user9516827

同じクエリの複数の並列スレッドはすべて、同じsession_idまたはspidを共有します。

ケンドラ・リトルは ここ であることを示す素晴らしい記事を書きました。

ブレントオザー Erik Darlingも素晴らしいですが、接線的に関連している場合は、それについて投稿してください here

クエリがそれ自体をブロックしている場合は、1つのスレッドが処理を完了するのに時間がかかっていることを示しています。これは、問題のテーブルの統計が古くなっている、または単にデータの分布が歪んでいるため、1つのスレッドが他のスレッドよりもはるかに多くの作業を受け取っていることを意味します。

6
Max Vernon