ハズレ実行計画になりやすいSQLとは?
SQL言語は目的(抽出条件、抽出項目等)を記述するだけの記述です。目的までの処理方法(実行計画)は基本的にRDBMS側が自動で検討するため、
常に最適な実行計画になることは保証されません。
本ページではORACLEデータベースにおいて、適切な統計情報を収集していたとしても誤った実行計画になりやすい要因をまとめます。
ハズレ実行計画になりやすい要因
- WHERE条件の数が多い
ORACLEは記述された抽出条件に対して統計情報の列種類数や行数などからカーディナリティを推測します。 一つの条件であれば統計情報が正しければかなり正確な見積もりをしてくれますが、条件が多いほど正確性に欠けていき、 ハズレの実行計画が選択される可能性が高くなります。対策としては、列相関を指定した拡張統計を収集することで 精度の高いカーディナリティ予測にすることができます
- 関数を含むWHERE条件
明示的に拡張統計を収集しなければ関数を含むwhere条件のカーディナリティは 関数の中身は厳密に考慮されず信頼性のある予測にはなりません。こちらも関数を指定した拡張統計を収集することで精度の高いカーディナリティ予測にすることができます。
- 結合する表の数が多い
ORACLEはパース時に様々な実行計画の処理時間を予測し、最も早い(COSTが低い)であろう実行計画を採択します。 結合する表が増えると取りうる実行計画のバリエーションが指数関数的に増加(7つ表があれば結合順序だけで7の階乗で5040通りもあります)していくため、 結合する表が多いとすべての実行計画バリエーションをを評価せずにある程度の段階で評価を打ち切る場合があります。 また、表を結合した時のカーディナリティ予測も結合表が増えるほど予測に予測を重ねることになり 精度が落ちるためハズレの実行計画が選択される可能性が高くなります。 目安として4個以上の結合になる場合は実行計画が適切であるか確認したほうがよいでしょう。
- 類似したキー構成の索引が多い
上述の通りORACLEはCOSTの最も低い実行計画を選択しますが、COSTが全く同じ実行計画が複数あった場合 どの実行計画を選択するかはわかりません。 例えば索引A(キー:COL1,COL2,COL3)と索引B(キー:COL1,COL2,COL4)があり、 COL1、COL2、COL3が等価条件指定されてあったとします。 この際、COL1とCOL2の等価条件で絞込後件数が1件以下であると統計から予測した場合、 AとBどちらの索引を使ったとしてもCOSTが同じのため、 最も適切な索引Aではなく索引Bが選択されてしまう場合があります。