Предложение Oracle START 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
Я попытался улучшить производительность двумя способами:
запрос 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 Release 2 запрос B выполнялся намного лучше, чем A.
У вас была аналогичная оптимизация производительности для рассмотрения в отношении предложений CONNECT BY
и WHERE
? Как бы вы объяснили, что запрос B намного лучше, чем запрос A?