SQLServerは、SQL処理時間がcost threshold for parallelismの値(デフォルト5秒)を超えるような場合、1つのSelect文であっても、シリアルではなくパラレルで処理します。
パラレル処理されれば1分程度で終わるSQLも、シリアルで実行されると数時間かかるという事も珍しくありません。
今回、サーバーの状態によって実行プランが変化し、パラレルで実行されてほしいSQLが、シリアルで処理される現象が発生しました。
開発環境のサーバーだと、必ずパラレル処理されるのに、本番系のサーバーではシリアルで処理され、極端に処理時間がかかるようになりました。
当初は、本番系のサーバーでもパラレル処理されていました。
チューニングアドバイザーを実行し直し、インデックスと統計情報を追加しても、ヒント文でインデックスを固定しても、cost threshold for parallelismの値を1に変更しても、パラレル処理されるようにはなりませんでした。
最終的には、問題のSQL限定で、開発環境のサーバーで使われている実行プランを丸ごと使い、実行プランを完全に固定してしまう事で、パラレル処理されるようになりました。
実行プランを完全固定したサンプルSQLはこちら。
SQLがシリアル実行されていた時の実行プラン。
SQLがパラレル実行されていた時の実行プラン。
最近のコメント