SE の雑記

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

ENABLE_PARALLEL_PLAN_PREFERENCE ヒントを使用した場合に確認しておきたいポイント

leave a comment

SQL Server では「ENABLE_PARALLEL_PLAN_PREFERENCE」という、クエリの並列化のコストを満たしていない状態でも、並列化の指示を出すための ヒント句 がアンドキュメントなクエリヒントとして提供されています。

このクエリヒントを使用すると、シングルスレッドで実行されているクエリを並列化することができる可能性があるのですが、並列化された際に確認をしておきたいポイントがあります。

ヒント句を使用した際に確認しておきたいポイント

今回、実行しているクエリと実行プランは次の内容となります。

image

このクエリに対して「OPTION (USE HINT(‘ENABLE_PARALLEL_PLAN_PREFERENCE’))」を追加すると並列クエリとして実行されます。

image

今回のクエリであれば、並列化することで実行時間が大きく減少していることが確認できます。

すべてのケースでこうなればよいのですが、実行プランによっては並列化しても実行時間に大きく変化しないこともあります。

並列化された操作については「すべての実行の実際の行数」または「実際に読み取られた行数」のプロパティを確認し、

  • 何スレッド使用されているか
  • 各スレッドで何行処理されているか

を確認するのが重要です。

image

上記の画像であれば、

  • スレッド14: 30,001,896
  • スレッド16: 66

となっており、複数のスレッドが使用されていますが、特定のスレッドで処理されている行数が偏っている状態となっています。

今回の実行プランでは、この処理以外で並列された箇所が複数のスレッドで均等に行数が分散されていたため、トータルとして処理時間が短縮されましたが、実行プランによっては並列化してもスレッドで処理されている行数に偏りがあり、並列化されても処理時間の短縮が思ったように行われないケースがあります。

ENABLE_PARALLEL_PLAN_PREFERENCE はヒント句を使用して並列プランの生成ができる可能性がありますが、本来並列プランを生成するコストではないクエリを並列化していますので、スレッドで処理される件数の偏りが発生しやすい可能性があります。

処理時間が期待した通り短縮されていない場合は、「並列処理として実行されているイテレータで、各スレッドで難行処理されているのか」の情報を意識すると、効果が出ていない理由を判断できる可能性があるかと思います。

Share

Written by Masayuki.Ozawa

10月 15th, 2023 at 11:43 pm

Posted in SQL Server

Tagged with

Leave a Reply