OracleSTART WITH ... CONNECT BY
句は、同じクエリで条件を適用する前に適用されます。WHERE
したがって、WHERE 制約は最適化には役立ちませんCONNECT BY
。
たとえば、次のクエリはおそらく全テーブル スキャンを実行します ( の選択性を無視しますdept_id
)。
SELECT * FROM employees
WHERE dept_id = 'SALE'
START WITH manager_id is null
CONNECT BY PRIOR employee_id = manager_id
私は2つの方法でパフォーマンスを改善しようとしました:
クエリ A:
SELECT * FROM employees
START WITH manager_id is null AND dept_id = 'SALE'
CONNECT BY PRIOR employee_id = manager_id
クエリ B:
SELECT * FROM (
SELECT * FROM employees
WHERE dept_id = 'SALE'
)
START WITH manager_id is null
CONNECT BY PRIOR employee_id = manager_id
どちらのクエリも元のクエリよりもはるかに優れたパフォーマンスを発揮しましたが、Oracle 10g リリース 2 では、クエリ B が A よりもはるかに優れたパフォーマンスを発揮しました。
CONNECT BY
andWHERE
句に関して同様のパフォーマンス最適化を行いましたか? クエリ B がクエリ A よりもはるかに優れていることをどのように説明しますか?