検索結果が一致しない!Oracle 12cとヒント句の組合せにはご用心

Oracle 12cにはかなり痛い目にあわされています。
どうもOracle 12cの機能に関する新規障害を引いてしまったようです。
ちなみにこの障害は2016年に引き当てましたが2017年時点でも解消されていないので注意してください。

概要

異なる環境(商用とテスト)でそれぞれ同一データ、同一SQLを流しているにも関わらず実行結果に差異が生じる。
差異が生じるSQLはいずれもヒント句が使用されている。

調査状況

まだOracle社にて調査中ですが、12cにて新たに追加された「適応問合せ最適化」機能の障害の可能性が高い見通しとの回答。
同一データ、同一SQLにも関わらず実行計画が違うものになってしまっています。
当初は、既知の障害(Bug22445503)ではないかとの回答がありましたが、既知障害に対する対処を施しても
事象が再発することから、異なる事象であることが確認されています。
2016年12月現在、Oracle社でまだ調査中の段階でありパッチ等は出ていません。

対処方法

「適応問合せ最適化機能により障害が引き起こされていること」
「適応問合せ最適化機能を無効化することで障害が発生しないこと」
まではOracleも認めています。
以上を踏まえると対処は2つになります。

ヒント句を削除する

ヒント句を使っているSQLは大体がOracle9以前の名残だったりします。
今では不要である可能性が非常に高いので処理は思い切ってOracleに任せることにし、ヒント句を削除するというやり方です。
ただし、この対処で障害が回避できるかの言及は得られておらず、データ不正が発生するリスクがあります。

適応問合せ最適化機能を無効化する

こちらの対処方法は2つありますが、実質的に適用可能。

  1. _optimizer_adaptive_plansはTRUEのまま、optimizer_adaptive_reporting_onlyをTRUEにする
  2. _optimizer_adaptive_plansをFALSEにする

前者の対処を選んでしまうと、“optimizer_adaptive_reporting_only=TRUE”となるため、Bug22445503の発生条件を満たしてしまいます。
よって、現時点で確実にできる対処は前者の「_optimizer_adaptive_plansをfalseにする」です。

どちらの対処を採用するにせよ、隠しパラメータの変更になるのでサポートからの回答なしに変更するとサポートが受けられなくなります。
必ず問合せを行うようにしてください。

この対処によってオプティマイザは11gR2相当の動作になるとOracleからの回答を得ています。
とは言ってもすべてが11gR2と同等になるとは考えづらいので、性能は検証する必要がありそうです。

今日のまとめ

Oracle 12cにはかなりやられています。
最近はOracle社の日本側ではソースを触る権限がないらしく、本国にエスカレーションするしかできないようです。
そのため、対応がかなり遅くなってしまっています。

他にも優先事項の高いトラブルから対処しているようなので中々、対応してもらえません。
顧客に納品するシステムで採用している方は注意しましょう。