増分計画および実行(IPE)は、クエリー最適化ルーチンがリクエストを部分的に計画し、段階的に実行できる適応的なクエリー最適化フレームワークです。Vantageは、各部分実行から中間結果または統計を動的に収集します。最適化ルーチンは結果のフィードバックを使用して、リクエストの残りの部分を書き換えます。これにより、パーティション排除、結合排除、結合インデックスの書き換え、述部簡略化などの高度な最適化が可能になります。最適化ルーチンは、統計のフィードバックを使用してより精度の高いコストの見積もりを作成し、最適な実行プランを選択します。
次に、2つのカテゴリの動的フィードバックのいくつかのタイプを示します。
結果フィードバック:
- 単一行リレーション: UPIまたはUSIの等価述部を持つ基本リレーション。
- 非相関スカラー サブクエリー。
- WHERE句に非相関EXISTSまたはNOT EXISTSサブクエリーがある。
- WHERE句にある非相関単一列のIN、NOT IN、ANY、またはALLサブクエリー。
- 単一行スプール: 結果が1行になることが決定される、折り重ならない派生テーブルまたはビュー。
統計フィードバック:
- 折り重ならない派生テーブルまたはビュー。
- リモート テーブル、テーブル演算子、およびテーブル関数。
- 集約または分析関数への中間スプール入力。
フィードバックのタイプは、実行に基づき結果と統計の間で動的に切り替わります。最適化ルーチンによってリクエストされたフィードバックのタイプに関係なく、AMPは実際の実行と結果サイズに基づいてフィードバックのタイプを選択します。
- 元の結果フィードバックでは、ターゲット スプールのサイズが大きすぎると、結果フィードバックから統計フィードバックに切り替えて、解析時間を最小化するために最適化ルーチンの処理負荷を軽減します。
元の統計フィードバックでは、ターゲット スプールが空の場合、または1行しか含まれていない場合、統計フィードバックから結果フィードバックへの切り替えにより、複雑なクエリーが結果フィードバックを有効に活用することができます。
例: 非相関スカラー サブクエリーのIPE結果フィードバック
まず、最適化ルーチンが非相関スカラー サブクエリーを検出します(例の太字部分)。
SELECT * FROM t1, (SELECT t2.a2 FROM t2, t3 WHERE t2.a2 = t3.a3 GROUP BY t2.a2) AS dt (a2) WHERE t1.a1 < (SELECT MAX(t4.a4) FROM t4) AND t1.a1 = dt.a2;
次に、最適化ルーチンでスカラー サブクエリーを実行するフラグメントを形成します。スカラー サブクエリーの結果は最適化ルーチンにフィードバックされ、結果がスカラー サブクエリーに代入されます。
結果が20であると仮定します。この代入によって、以下のクエリー リライトが可能になります。
- 推移閉包を使用した述部の導出。
SELECT * FROM t1, (SELECT t2.a2 FROM t2, t3 WHERE t2.a2 = t3.a3 GROUP BY t2.a2) AS dt (a2) WHERE t1.a1 < 20 AND t1.a1 = dt.a2 AND dt.a2 < 20;
- 導出した述部の派生テーブルへの後付け。
SELECT * FROM t1, (SELECT t2.a2 FROM t2, t3 WHERE t2.a2 = t3.a3 AND t2.a2 < 20 GROUP BY t2.a2) AS dt (a2) WHERE t1.a1 < 20 AND t1.a1 = dt.a2 AND dt.a2 < 20;
- 推移閉包を使用した派生テーブル内部での述部の導出。
SELECT * FROM t1, (SELECT t2.a2 FROM t2, t3 WHERE t2.a2 = t3.a3 AND t2.a2 < 20 AND t3.a3 < 20 GROUP BY t2.a2) AS dt (a2) WHERE t1.a1 < 20 AND t1.a1 = dt.a2 AND dt.a2 < 20;
これで、パーティション排除など、上記で説明したようなさらに高度な最適化が実行できるようになります。