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


11

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';

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

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

ALTER SYSTEM SET PARALLEL_DEGREE_LIMIT = 24;

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

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

回答:


8

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

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

IOの 調整 IOが調整されていなかったため、自動DOPが使用されていない可能性があり、したがって制限が守られていません。このクエリは、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で実行します。驚くかもしれません。
  • はい、並列処理が多すぎると良くない場合があります。しかし、最適なセッション数よりもわずかに多い、またはクエリを強制的にシリアルにして基本的に重要なジョブを強制終了する、システムにとって何が悪いのでしょうか。任意の制限を導入する前に、システムを監視する必要があります。

うわー!おかげで、ここで理解することがたくさんあり、非常に役立つアドバイスがあります。
手榴弾
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.