【AIによる回答】
Oracle 11gから19cへの移行は、CPU処理効率の向上、インメモリ処理、自動化機能の進化により、バッチ処理や大規模な参照系で劇的なパフォーマンス向上をもたらします。オプティマイザの最適化やリソース消費の効率化によって、全体のシステム負荷が大幅に軽減されます。 [1]バージョン間の主な進化とパフォーマンスの差異1. 自動チューニングとオプティマイザの進化
- Oracle 11g:統計情報の取得やSQLの実行計画が固定化されやすく、データ量の増加に伴うパフォーマンス低下(カーディナリティの誤見積もりなど)が起きやすい傾向がありました。
- Oracle 19c:「適応型問合せ最適化」や「自動SQLチューニング」が大幅に強化されました。実行中に非効率なSQLを自動検知し、最適なパスへ自律的に修正する機能が標準で備わっています。 [1]
2. インメモリ機能(In-Memory)の搭載
- Oracle 11g: すべてのデータは行形式で処理・キャッシュされていました。
- Oracle 19c: 「Oracle Database In-Memory」が利用可能です。データをメモリ上で列形式(カラムナー)に変換して保持できるため、大量のデータ集計や分析処理を数十倍から数百倍に高速化できます。
3. ハードウェア資源の効率的な活用
- Oracle 11g: マルチコアCPUや大容量メモリをフルに活用するための処理の並列化において、競合が発生しやすい場面がありました。
- Oracle 19c: メモリ管理(自動SGAチューニングなど)や、Direct Path I/Oなどの処理が現代のハードウェア(大容量メモリ・高速SSD/NVMe・多数のCPUコア)向けに最適化されており、リソースの無駄を省きスループットが向上しています。 [1]
4. 高度なマルチテナントとリソース制御
- Oracle 11g: 複数のデータベースを統合する場合、それぞれが独立したインスタンスを起動する必要があり、オーバーヘッドが生じていました。
- Oracle 19c: 「Multitenant(マルチテナント)」機能により、コンテナ・データベース(CDB)内で複数のプラガブル・データベース(PDB)を一元管理できます。PDBごとのリソース制限(CPU使用率の上限設定など)が高度に制御できるため、統合時のパフォーマンス低下を防ぎます。 [1]
注意すべきポイント(マイグレーション時の考慮点)
- 実行計画の変化による差異
11gから19cへアップグレードすると、オプティマイザの賢さゆえにこれまでと違う実行計画が選択される場合があります。これが良い方向に働けば高速化しますが、特定のSQLでレスポンスが悪化する「プランの回帰(Regress)」が起こる可能性があります。- 事前の検証推奨
移行前には「Real Application Testing(RAT)」などのツールを活用し、本番環境のワークロードを19c環境で再現して、パフォーマンスへの影響を事前に検証することを強く推奨します。
11g 19c 実行計画において、オプティマイザによるパフォーマンス低下を解消する
Oracle 11gから19cへのアップグレードに伴うオプティマイザの動作変更(機能追加やコスト計算式の変更)によるパフォーマンス低下(実効計画の劣化)を解消するには、一時的な回避策を適用した上で、根本原因である統計情報やパラメータの最適化、またはSQL計画管理(SPM)による計画の固定を行います。 [1, 2]状況の緊急度やシステム要件に応じて、以下の手順で対処を進めてください。
1. 【緊急対処】暫定的なパラメータ変更による回避バージョンアップによってオプティマイザの挙動が変わり、これまで最適だった実行計画が選択されなくなった場合、もっとも迅速に効果が期待できるのがOPTIMIZER_FEATURES_ENABLEの変更です。これにより、オプティマイザの動作を一時的に 11g(11.2.0.4など)の挙動に戻すことができます。 [1, 2]
- セッション単位での適用(テスト・安全な検証)
特定のバッチ処理や、検証環境でのテストに有効です。sqlALTER SESSION SET OPTIMIZER_FEATURES_ENABLE='11.2.0.4';コードは注意してご使用ください。- 特定のSQL文のみへの適用(ヒント句)
影響範囲を限定したい場合に SQL 文へ直接記述します。sqlSELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.4') */ カラム名 FROM テーブル名;コードは注意してご使用ください。- システム全体への適用(最終手段)
システム全体で多くの SQL が一斉に劣化している場合の緊急避難措置です。sqlALTER SYSTEM SET OPTIMIZER_FEATURES_ENABLE='11.2.0.4' SCOPE=BOTH;コードは注意してご使用ください。
2. 【恒久対処】SQL計画管理(SPM)による実行計画の固定Oracle 11g 以降で標準提供されている SQL計画管理(SPM: SQL Plan Management) を使用して、11g 時点で最速だった実行計画を「SQL計画ベースライン」として 19c に引き継ぎ、固定化します。これにより、意図しない計画変更によるリスクを最小限に抑えられます。 [1, 2, 3]
3. 【根本解決】オプティマイザ統計情報の再収集と適正化19c の新しいオプティマイザに正しい判断をさせるためには、最新かつ正確な統計情報が必要です。11g から移行した直後は、統計情報の形式やサンプリング方法の違いが原因でコスト計算に狂いが生じているケースが多々あります。 [1, 2]
- 19cでの統計情報の再収集:
移行時に古い統計情報をそのまま引き継いでいる場合、19c のデフォルト設定(AUTO_SAMPLE_SIZEの精度向上など)で統計情報を再収集します。sqlEXEC DBMS_STATS.GATHER_TABLE_STATS('スキーマ名', 'テーブル名', CASCADE=>TRUE);コードは注意してご使用ください。- データ偏りへの対処(ヒストグラム):
特定の列にデータの偏りがある場合、19c のオプティマイザがそれを誤認している可能性があります。必要に応じてヒストグラムを収集するか、不要なヒストグラムを削除します。 [1]
4. 19c 新機能「自動SPM展開」の確認Oracle Database 19c では、バックグラウンドのメンテナンス・タスクとして「SPM展開アドバイザ」が自動稼働します。
AWR 内を自動で探索し、オプティマイザが「以前の計画の方が速い」と判断した代替計画を見つけた場合、自動的にパフォーマンスが良い方の計画をベースラインに組み込んで解決を図る仕組みが備わっています。この機能(AUTOMATIC_SPM_EVOLUTION)が有効になっているかを確認・活用するのも有効です。 [1]
💡 状況をさらに絞り込んで具体的な解決策を提案するため、以下について教えていただけますか?
- パフォーマンス低下が起きているのは特定のSQLですか?それともシステム全体ですか?
- 11gの稼働時に取得したAWR(自動ワークロードリポジトリ)のデータや、過去の実行計画は手元に残っていますか?
- すでに19c環境で統計情報の再収集(DBMS_STATS)は試されましたか? [1]
