QA@IT

SQLServerでクエリ実行時に並列処理を強制する

10703 PV

以下の環境で動作しているデータベースがあります。

OS:Windows 2003 Server Standard
DB:SQLServer2005SP2 Standard

最近動作が遅くなったクエリがあると聞いて、上記環境の1ヶ月前のバックアップと
最近のバックアップをそれぞれ開発環境で復元し、クエリの実行計画をとってみました。

その結果1ヶ月前のDBでは実行計画にParallelismが表示され並列処理で動作している
事がわかりました。その場合1秒以内に動作完了します。

最近のDBでは実行計画にParallelismが表示されず、並列処理はされていないようです。
結果が戻ってくるまで30秒以上かかってしまいます。

1ヶ月前のDBでMAXDOPを1にして実行すると30秒以上かかるようになるので、
最近のDBで遅くなってしまったのは並列処理で実行されなくなってしまったからだと
思われます。

最近のDBの方で並列処理を強制するにはどうすればいいのでしょうか。
MAXDOPやcost threshold for parallelism、max degree of parallelismなどを変更して試してみましたが
並列処理になりません。
他に並列処理に関係するパラメータがあるでしょうか。

回答

こんにちは。

MAXDOPは並列度の最大値を変更するだけで、
強制するパラメータではないために、実現したい内容に対しては効果がありません。
cost threshold for parallelismを既定値の5より小さくすることで、
並列度は上がるケースがありますが、それも試されたようなので別の対処を
検討する必要がありそうです。

SQL Serverの動作としては、
・CPU数
・空きスレッド数
・クエリとインデックスの状況
・行数
・統計情報
に基づいて並列度をオプティマイザが決定します。
http://msdn.microsoft.com/ja-jp/library/ms188611.aspx

これらの要素の内、比較的変更しやすいのが、
統計情報となりますので、統計情報の手動更新を実施してみる、
というのが次の対処となるかと思います。

それでも速度が改善しない場合、
根本的なクエリチューニングが次の手になるかと思います。

編集 履歴 (0)
  • ありがとうございます。
    その後動作が速くなったと聞いたので、実行計画を
    とってみるとParallelismが使われていました。
    なぜ元に戻ったのかは不明ですが、問題は解決したので
    終了とさせて頂きます。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。