私の以前の経験では、並列処理のコストしきい値はCXPACKETの削減に役立ちませんでした。
CXPACKET
不正確な統計が原因でスキュー並列処理が行われるため、高待機が発生する可能性があります。
- CXPACKET待機の詳細:スキュー並列処理
- Microsoft Connectアイテム
- 並列処理のためにクエリが待機していますか?-ティム・フォード
以下は、CXPacketと「その他の待機」の両方を含むセッションを見つけるために使用したSQLです(下の図をご覧ください)。
SQL
DECLARE @RawResult TABLE ([database_id] INT,[session_id] INT,exec_context_id INT, [blocking_session_id] INT,task_state VARCHAR(20),
[cpu_time] BIGINT,[wait_duration_ms] BIGINT, [wait_type] VARCHAR(100),[resource_description] nvarchar(3072),
[sql_handle] varbinary(64),[plan_handle] varbinary(64)
)
INSERT INTO @RawResult
SELECT
[R].[database_id],
[S].[session_id],
[W].exec_context_id,
[W].blocking_session_id,
[T].task_state,
[R].[cpu_time],
[W].[wait_duration_ms],
[W].[wait_type],
[W].[resource_description],
[R].[sql_handle],
[R].[plan_handle]
FROM sys.dm_os_waiting_tasks [W]
INNER JOIN sys.dm_os_tasks [T] ON
[W].[waiting_task_address] = [T].[task_address]
INNER JOIN sys.dm_exec_sessions [S] ON
[W].[session_id] = [S].[session_id]
INNER JOIN sys.dm_exec_requests [R] ON
[S].[session_id] = [R].[session_id]
WHERE [S].[is_user_process] = 1
--AND S.session_id <> @@SPID--???
--ORDER BY [W].[session_id],[W].[exec_context_id];
SELECT
DB_NAME(C.database_id) AS database_name,
C.[database_id],
C.[session_id],
C.exec_context_id,
C.blocking_session_id,
C.task_state,
C.[cpu_time],
C.[wait_duration_ms],
C.[wait_type],
C.[sql_handle],
C.[plan_handle],
[H].text,
[P].[query_plan],
C.[resource_description]
FROM @RawResult C
OUTER APPLY sys.dm_exec_sql_text (C.[sql_handle]) [H]
OUTER APPLY sys.dm_exec_query_plan (C.[plan_handle]) [P]
WHERE C.[session_id] IN
(
SELECT A.[session_id]
FROM @RawResult A
INNER JOIN @RawResult B
ON A.[session_id] = B.[session_id]
AND A.wait_type='CXPACKET'
AND B.wait_type <> 'CXPACKET'
)
ORDER BY C.[session_id],C.[exec_context_id]
大規模なスキャンも根本原因の一部になります。上記のクエリから実行プランをチェックしたところ、データベースでそのようなスキャンが見つかりました。また、実行計画にインデックスの提案がありませんでした。