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ですが、実際のパターンはありません)を超えるクエリを頻繁に確認します。
単一のクエリが使用可能なすべてのリソースを占有するのをどのように防ぐことができますか?