Oracle11.2.0.4から12.1.0.2に新しくアップグレードされたデータベースでいくつかのSQLステートメントの調整に取り組んでいます。私は通常、SQLDeveloperを使用してExplainPlanを確認するのが好きです。 ExplainPlanの出力に灰色のテキストが表示されているのを見て驚いた。これは以下に表示されている。
私の最初の反応は、オラクルが2つのテーブルを結合するためにハッシュ結合とネストされたループ結合の両方を持っている理由を驚かせることでした。計画の後半で、INDEX(RANGE SCAN)が実行されている同じテーブルのINDEX(FAST FULL SCAN)が表示されます。同じテーブルに2回アクセスするのはなぜですか? Oracle 12cは何をしていますか?
これらはすべて、新しい12cオプティマイザーのアダプティブクエリ最適化の一部です。このSQLステートメントでは、オプティマイザーはネストされたループの結合を含む初期計画を使用することを決定しました。ネストされたループの結合を含むプランの場合、Oracleはインデックス範囲スキャンを使用してテーブルにアクセスします。オプティマイザーは、ハッシュ結合へのインデックス高速フルスキャンを検討する別の実行プランである可能性があることも決定しました。 SQLステートメントの実行が始まる前に、オプティマイザーには2つのプランがあります。 1つの計画はデフォルトです 計画と他の計画は適応型です 予定。 Oracleは、デフォルトの計画で実行を開始するときにSQLステートメントの実行を監視します。 Oracleがこれが間違った実行プランであると判断した場合、その場でアダプティブプランに切り替えることができます。
アダプティブプランの詳細については、Oracleのこのホワイトペーパーを参照してください。 3〜5ページは、実際の適応型結合プランを示しています。
上記の説明プランの灰色のテキストは、単に適応プランです。 SQL Developer 4.1には、デフォルトの計画と適応型の計画の両方が表示されます。
Explain Planのさらに下には、その他のXMLセクションがあります。これを以下に示します。私のdbバージョンは12.1.0.2であることがわかります。情報タイプは、これがアダプティブプランであることを示すこともできます。
「行」というタイトルのセクションに注意してください。 ExplainPlanの各行を見ることができます。 「skp=0」の行は、デフォルトのプランの一部です。 「skp=1」が適応プランである行は、SQLDevelopersでは灰色のテキストとして表示されます。