この記事には広告を含む場合があります。記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。
Oracle 12cにはかなり痛い目にあわされています。
どうもOracle 12cの機能に関する新規障害を引いてしまったようです。
ちなみにこの障害は2016年に引き当てましたが2017年時点でも解消されていないので注意してください。
概要
異なる環境(商用とテスト)でそれぞれ同一データ、同一SQLを流しているにも関わらず実行結果に差異が生じる。
差異が生じるSQLはいずれもヒント句が使用されている。
調査状況
まだOracle社にて調査中ですが、12cにて新たに追加された「適応問合せ最適化」機能の障害の可能性が高い見通しとの回答。
同一データ、同一SQLにも関わらず実行計画が違うものになってしまっています。
当初は、既知の障害(Bug22445503)ではないかとの回答がありましたが、既知障害に対する対処を施しても事象が再発することから、異なる事象であることが確認されています。
2016年12月現在、Oracle社でまだ調査中の段階でありパッチ等は出ていません。
対処方法
「適応問合せ最適化機能により障害が引き起こされていること」
「適応問合せ最適化機能を無効化することで障害が発生しないこと」
まではOracleも認めています。
以上を踏まえると対処は2つになります。
ヒント句を削除する
ヒント句を使っているSQLは大体がOracle9以前の名残だったりします。
今では不要である可能性が非常に高いので処理は思い切ってOracleに任せることにし、ヒント句を削除するというやり方です。
ただし、この対処で障害が回避できるかの言及は得られておらず、データ不正が発生するリスクがあります。
適応問合せ最適化機能を無効化する
こちらの対処方法は2つありますが、実質的に適用可能なのは「_optimizer_adaptive_plansをFALSEにする」になります。
- _optimizer_adaptive_plansはTRUEのまま、optimizer_adaptive_reporting_onlyをTRUEにする
- _optimizer_adaptive_plansをFALSEにする
前者の対処を選んでしまうと、“optimizer_adaptive_reporting_only=TRUE”となるため、Bug22445503の発生条件を満たしてしまいます。
よって、現時点で確実にできる対処は前者の「_optimizer_adaptive_plansをfalseにする」です。
どちらの対処を採用するにせよ、隠しパラメータの変更になるのでサポートからの回答なしに変更するとサポートが受けられなくなります。
必ず問合せを行うようにしてください。
この対処によってオプティマイザは11gR2相当の動作になるとOracleからの回答を得ています。
とは言ってもすべてが11gR2と同等になるとは考えづらいので、性能への影響は検証する必要がありそうです。
今日のまとめ
Oracle 12cにはかなりやられています。
最近はOracle社の日本側ではソースを触る権限がないらしく、本国にエスカレーションするしかできないようです。
そのため、対応がかなり遅くなってしまっています。
他にも優先事項の高いトラブルから対処しているようなので中々、対応してもらえません。
顧客に納品するシステムで採用している方は注意しましょう。