sql >> データベース >  >> RDS >> Oracle

OracleSQLDeveloperでのExplainPlanの実行の結果を理解する

    EXPLAIN PLANの出力は、Oracleのクエリオプティマイザからのデバッグ出力です。 COSTは、コストベースのオプティマイザー(CBO)の最終出力であり、その目的は、クエリの実行に使用する可能性のある多くの異なるプランのどれを選択することです。 CBOは、各プランの相対コストを計算してから、コストが最も低いプランを選択します。

    (注:CBOには、考えられるすべての計画を評価するのに十分な時間がない場合があります。この場合、CBOは、これまでに見つかったコストが最も低い計画を選択するだけです)

    一般に、クエリの速度が遅い原因の1つは、クエリを処理するために読み取られる行数(より正確にはブロック)であるため、コストは一部に基づいています。 行数については、オプティマイザーの見積もりを読み取る必要があります。

    たとえば、次のクエリがあるとします。

    SELECT emp_id FROM employees WHERE months_of_service = 6;
    

    months_of_service 列にはNOTNULL制約があり、通常のインデックスがあります。)

    オプティマイザーがここで選択する可能性のある2つの基本的な計画があります:

    • プラン1:「employees」テーブルからすべての行を読み取り、それぞれについて、述語がtrueであるかどうかを確認します(months_of_service=6
    • プラン2:months_of_service=6のインデックスを読み取ります (これにより、一連のROWIDが生成されます)、返されたROWIDに基づいてテーブルにアクセスします。

    「employees」テーブルに1,000,000(100万)行があると想像してみましょう。さらに、months_of_serviceの値が1から12の範囲であり、何らかの理由でかなり均等に分散されていると想像してみましょう。

    プラン1の費用 、これにはフルスキャンが含まれ、employeesテーブルのすべての行を読み取るコストになります。これは約1,000,000に相当します。ただし、Oracleはマルチブロック読み取りを使用してブロックを読み取ることができる場合が多いため、実際のコストは低くなります(データベースの設定方法によって異なります)。マルチブロックの読み取りカウントが10であると想像してみましょう。フルスキャンの計算コストは​​1,000,000/10になります。総費用=100,000。

    プラン2の費用 INDEX RANGE SCANとROWIDによるテーブルルックアップを含むは、インデックスをスキャンするコストに加えて、ROWIDによるテーブルへのアクセスのコストになります。インデックス範囲スキャンのコストについては説明しませんが、インデックス範囲スキャンのコストが1行あたり1つであると想像してみましょう。 12のケースのうち1つで一致が見つかると予想されるため、インデックススキャンのコストは1,000,000 / 12=83,333です。プラステーブルへのアクセスコスト(アクセスごとに1ブロックの読み取りを想定し、ここではマルチブロック読み取りを使用できません)=83,333;全体のコスト=166,666。

    ご覧のとおり、プラン1(フルスキャン)のコストはプラン2(インデックススキャン+ rowidによるアクセス)のコストよりも少なく、CBOがフルスキャンを選択することを意味します。

    オプティマイザーがここで行った仮定が正しい場合、実際にはプラン1が優先され、プラン2よりもはるかに効率的です。これはフルスキャンが「常に悪い」という神話を反証します。

    オプティマイザーの目標がALL_ROWSではなくFIRST_ROWS(n)の場合、結果はまったく異なります。この場合、オプティマイザーは最初の数行をより速く返すことが多いため、プラン2を優先しますが、クエリ全体の効率が低下します。 。



    1. mysqlプリペアドステートメントエラー:MySQLSyntaxErrorException

    2. 自分のドッグフードを食べる–MariaDBでJIRAを実行する

    3. Oracleステートメント

    4. RailsコンソールはIDの配列でユーザーを検索します