在使用同一查询中的WHERE条件之前,应用Oracle START WITH … CONNECT BY子句.因此,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第2版上,查询B的执行效果要好于A.
您是否有类似的性能优化来处理CONNECT BY和WHERE子句?你如何解释查询B比查询A好多了?
解决方法
查询A表示从销售部门的经理开始,然后获得所有员工. Oracle不会“知道”所有返回的员工都将在销售部门进行查询,因此在执行CONNECT BY之前不能使用该信息来减少要处理的数据.
Query B明确地将要处理的数据集合简化到Sales中的那些员工,Oracle在执行CONNECT BY之前可以执行此操作.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。