web-dev-qa-db-ja.com

クエリで使用できる並列度(DOP)を制限する

Oracle Exadata(11gR2)では、データベースが比較的頑丈です。

  • cpu_countは24です
  • parallel_server_instancesは2です
  • parallel_threads_per_cpuは2

Oracle Enterprise Manager(OEM)での観察により、クエリが連続して実行されるためパフォーマンスがひどいことに気付きました。これを解決するために、すべてのテーブル、マテリアライズドビュー、およびインデックスが、並列処理を利用するように変更されました。例えば:

ALTER TABLE SOME_TABLE PARALLEL (DEGREE DEFAULT INSTANCES DEFAULT);

並列化をオンにするようにシステムが変更されました。

ALTER SYSTEM SET PARALLEL_DEGREE_POLICY = 'AUTO';

これによりパフォーマンスが向上しましたが、単一のクエリでDOPが96(利用可能なすべてのリソース)になることがOEMで時々観察されました。これにより、後続のクエリが1のDOPにダウングレードされました(並列化なし)。クエリの処理が完了するまでパフォーマンスが低下します。

これを解決するために、次のコマンドを使用して、クエリで使用できるDOPを制限しようとしました。

ALTER SYSTEM SET PARALLEL_DEGREE_LIMIT = 24;

これは効果がありませんでした。制限(通常は48または96ですが、実際のパターンはありません)を超えるクエリを頻繁に確認します。

単一のクエリがすべての使用可能なリソースを占有するのをどのように防ぐことができますか?

11
grenade

Parallel Server Sets:PARALLEL_DEGREE_LIMITは並列処理の度合いを制限しますが、クエリがソートまたはグループ化されている場合、並列プロセスの数は2倍(2サーバー)プロセス間並列処理を有効にするための設定)。これが、24の制限があっても48の並列プロセスが表示される理由を説明しています。これは、リソースマネージャーを使用してDOPを制限する場合にも発生します。

並列ヒント:PARALLEL_DEGREE_LIMITは、自動並列度を使用するステートメントにのみ適用されます。ハードコーディングされた次数を使用するステートメント、またはオブジェクトレベルの並列ヒントのタイプでさえ、この制限は無視されます。これらのヒントがある場合、96が表示されることがある理由を説明できます。

キャリブレーションIO:おそらく自動DOPが使用されておらず、IO calibrated ではありませんでした。このクエリは、IOが調整されたかどうかを示します。

select * from V$IO_CALIBRATION_STATUS;

これにより問題が発生することは以前にもありましたが、現在のシステムは調整されておらず、自動DOPは正常に機能しているようです。これが本当に問題であるかどうかは、説明計画の「メモ」セクションを見ればわかります。 - automatic DOP: Computed Degree of Parallelism is 2大丈夫ですが、見たくないですautomatic DOP: skipped because of IO calibrate statistics are missing

PARALLEL_MAX_SERVERSを増やします:並列サーバーの不足を心配する代わりに、PARALLEL_MAX_SERVERSを大幅に増やすことをお勧めします。メモリ設定に応じて、少なくとも デフォルト値 、PARALLEL_THREADS_PER_CPU x CPU_COUNT x concurrent_parallel_users x 5に戻してみてください。240から960の間です。

これらの高い数値は多くのDBAにとってばかげているように聞こえますが、実際には次の理由から多くの意味があります。

  • Oracle並列サーバーは、ほとんどの人が想定しているよりも軽量です。 (そして、誰もそれをテストすることはほとんどなく、大きなDOPが問題を引き起こす1つの状況を見つけ、高いDOPは常に悪いと仮定します。)
  • 最初の50行のみを取得するGUIツールでアドホッククエリを実行することは一般的ですが、それでも数十の並列サーバーを使用します。 PARALLEL_MAX_SERVERSが低すぎない限り、これらのクエリは重要なリソースを消費していません。次に、完全に妥当なクエリを実行すると、人々は怒鳴りつけられ、醜い状況につながる可能性があります。
  • 1つのクエリの非常に大きなDOPは必ずしも悪いことではありません。 DOPを増やし続けるとオーバーヘッドが高くなりすぎてパフォーマンスが大幅に低下すると誰もが想定しています。しかし、多くのシステムで、途方もなく高いDOPでもパフォーマンスが向上することがわかりましたが、リターンは確実に減少しており、他のセッションと比べて不公平である可能性があります。しかし、推測するだけでなく、テストしてください。クエリを取り、1000までのあらゆる種類のDOPで実行します。驚くかもしれません。
  • はい、並列処理が多すぎると良くない場合があります。しかし、最適なセッション数よりわずかに多い、またはクエリをシリアルに強制して基本的に重要なジョブを強制終了する、システムにとって何が悪いのでしょうか。任意の制限を導入する前に、システムを監視する必要があります。
8
Jon Heller