まだあまり検証ができていないのですが、今後調べる際のメモとして。
SQL Server でクエリを実行していて CPU リソースに余裕があるので、意図的に並列クエリ (Parallel QUery) として実行したい場合があるかと思います。
並列クエリ→シングルクエリとして実行したい場合には MAXDOP で制限することができるのですが、逆のオプション (並列クエリを強制する) はありません。
何か方法がないかと調べていたところ、海外のブログでいくつか紹介がされていました。
Forcing a Parallel Query Execution Plan
方法としては、
- DBCC SETCPUWEIGHT を使用して CPU のコストを調整する
DBCC SETCPUWEIGHT(1000) というような形式で実行して CPU の重みを調整し並列クエリとしてのコストを満たしやすいようにする。 - QUERYTRACEON 8649 を使用する
OPTION (RECOMPILE, QUERYTRACEON 8649) といような OPTION 句に QUERYTRACEON を追加し、トレースフラグを有効にする
といったものが紹介されています。
ブログの中に connect へのリンク があり、以下のようなコメントがされています。
Thanks for the suggestion. We will consider this for a future release. There is an undocumented trace flag 8649 to set the cost overhead of parallelism to 0. This may provide some relief, but is not a full solution. You can use it in a query hint in the form OPTION(querytraceon 8649).
トレースフラグ 8649 を使用する場合、並列処理のコストのしきい値を調整する必要が出てくるようですね。
これらの方法を使用することで並列クエリとしてのプランを生成しやすいように調整することができるようです。
# 確実に並列クエリになるわけではないようですが。
DBCC SETCPUWEIGHT / QUERYTRACEON ともに非公開ドキュメント (Undocumented) なものになりますので利用方法については注意する必要がありますが、このような方法があるということをいままで知りませんでした。
最近、クエリ系の勉強をちょくちょくするようにしているのですが、知らないことがたくさんなのでもっと勉強しないとと痛感しています。