Клаузата START WITH ... CONNECT BY
на Oracle се прилага преди прилагането на 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 начина:
запитване А:
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?