[S] Oracle 12cとヒント句の組合せにはご用心

Oracle 12cにはかなり痛い目にあわされています。
どうもOracle 12cの機能に関する新規障害を引いてしまったようです。

概要

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

調査状況

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

対処方法

適応問合せ最適化機能により障害が引き起こされていること、
障害の根源である適応問合せ最適化機能を無効化することで
事象が再発しないことまではOracleも認めています。
以上を踏まえると対処は2つになりそうです。

ヒント句を削除する

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

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

_optimizer_adaptive_plansをfalseにするか
_optimizer_adaptive_plansはTRUEのまま、optimizer_adaptive_reporting_onlyをTRUEにします。
いずれにせよ隠しパラメータの変更になるのでサポートからの回答なしに変更すると
サポートが受けられなくなるので必ず問合せは必要となるでしょう。
また、“optimizer_adaptive_reporting_only=TRUE”を設定すると、Bug 22445503の発生条件を満たしてしまいます。
よって、現時点で確実にできる対処は_optimizer_adaptive_plansをfalseにすることになります。
この対処によってオプティマイザは11gR2相当の動作になるとの回答を得ています。
とは言ってもすべてが11gR2と同等になるとは考えづらいので、
性能は検証する必要がありそうです。

今日のまとめ

Oracle 12cにはかなりやられています。
使っている方は注意しましょう。