Предложение 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
Я пытался улучшить производительность двумя способами:
запрос А:
SELECT * FROM employees
START WITH manager_id is null AND dept_id = 'SALE'
CONNECT BY PRIOR employee_id = manager_id
запрос Б:
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?