計画を実行するためのステップ
実行計画の各ステップは、次のステップで使用されるか、最終ステップで SQL ステートメントを発行したユーザーまたはアプリケーションに返される行のセットを返します。各ステップによって返される行のセットは、行ソースと呼ばれます。図 5-1 樹形図は、あるウォークから別のウォークへのデータの流れを示しています。各ステップの番号は、実行プランを表示するときにステップが表示される順序を反映しています (実行プランの表示方法については簡単に説明しています)。一般に、これは各ステップが実行される順序ではありません。実行計画の各ステップは、データベースから行を取得するか、1 つ以上の行ソースから入力として行データを受け取ります。
赤いボックスで示された手順では、データベース内のデータ ファイルからデータを物理的に取得します。このステップをアクセス パスと呼びます。Oracle で使用できるアクセス パスについては、後で詳しく説明します。
ステップ 3 と 6 では、それぞれ EMP テーブルと SALGRADE テーブルからすべての行を読み取ります。
ステップ 5 では、ステップ 3 によって返された各 DEPTNO 値を PK_DEPTNO インデックスで検索します。 DEPT テーブルに関連付けられている行の ROWID を見つけます。
ステップ 4 では、ステップ 5 で ROWID が返された行を DEPT テーブルから取得します。
黒いテキスト ボックスで示される手順は、2 つのテーブル間の関連付け、並べ替え、フィルター処理など、行ソースに対して実行されます。詳細については、後ほど説明します。
ステップ 2 では、ネストされたループ操作 (C ステートメントのネストされたループに相当) を実装し、ステップ 3 と 4 から行ソースを受け取り、ステップ 3 のソースの各行をステップ 4 の行ソースと比較します。対応する行は連結され、結果の行はステップ 1 に返されます。
ステップ 1 でフィルター操作が完了します。ステップ 2 と 6 から行ソースを受け取り、ステップ 6 に対応する行がある行をステップ 2 から削除し、ステップ 2 の残りの行を発行者に返します。
一連の実行計画ステップを実装する
実行計画のステップは、番号が付けられた順序で実装されるわけではありません。Oracle は、図 5-1 のツリー構造グラフの葉として表示されるステップ (たとえば、ステップ 3、5、および 6) を最初に実装します。各ステップによって返される行は、次のステップの行ソースと呼ばれます。次に、Oracle は親ステップを実装します。
たとえば、図 5-1 の文を実行するために、Oracle はこれらのステップを次の順序で実装します。
まず、Oracle はステップ 3 を実装し、結果の行を行ごとにステップ 2 に返します。
手順 3 で返された行ごとに、Oracle は次の手順を実装します。
-- Oracle はステップ 5 を実装し、結果の ROWID をステップ 4 に返します。
-- Oracle はステップ 4 を実装し、結果行をステップ 2 に返します。
-- Oracle はステップ 2 を実装し、ステップ 3 からの行とステップ 4 からの行を受け入れて戻ります。
ステップ 1 に 1 行追加します。
-- Oracle はステップ 6 を実装します。結果行がある場合は、ステップ 1 に戻ります。
-- Oracle はステップ 1 を実装します。ステップ 6 から行が返された場合、Oracle はステップ 2 からの行を
SQL ステートメントを発行したユーザー。
Oracle は、ステップ 3 で返された行ごとにステップ 5、4、2、および 6 を 1 回実行することに注意してください。多くの親ステップは、子ステップから 1 行を実行するだけで実行できます。このような親ステップの場合、子ステップから 1 つの行が返されるとすぐに、親ステップ (および場合によっては実行プランの残りの部分) が実装されます。親ステップの親ステップも単一行リターンによってアクティブ化できる場合、それも実行されます。したがって、実行は、場合によっては実行計画の残りの部分を含めてツリー上に連鎖することができます。このような操作では、first_rows を最適化ターゲットとして使用して、ユーザーのリクエストに迅速に応答できます。
子ステップによって順番に取得される行ごとに、Oracle は親ステップと連結されたすべてのステップを 1 回実装します。子ステップによって返される行ごとにトリガーされる親ステップには、テーブル アクセス、インデックス アクセス、ネストされたループ結合、およびフィルターが含まれます。
一部の親ステップでは、実装する前に子ステップのすべての行が必要になります。このような親ステップの場合、Oracle は子ステップからすべての行が返されるまで親ステップを実装できません。このような親ステップには、並べ替え、並べ替えと結合の結合、グループ関数、および合計が含まれます。このような操作の場合、first_rows を最適化ターゲットとして使用することはできませんが、all_rows を最適化ターゲットとして使用して、このタイプの操作のリソース消費を最小限に抑えることができます。
場合によっては、ステートメントが実行されるときに、上記のようにステップごとに実行されるのではなく、効率を高めるために、実際の環境ではステップ 3、5、および 4 が並行して実行されることがあります。上のツリー図からは、各操作が実行される順序を確認するのは困難ですが、ORACLE によって生成される別の形式の実行プランを使用すると、どの操作が最初に実行され、どの操作が後で実行されるかを簡単に確認できます。本当に必要なのは実行計画であり、後で詳しく説明します。
この記事は CSDN ブログからのものです。転載する場合は出典を明記してください: http://blog.csdn.net/lcyhjx/archive/2009/12/20/5044799.aspx
-