sql – 在与WHERE子句一起使用时优化Oracle CONNECT BY

前端之家收集整理的这篇文章主要介绍了sql – 在与WHERE子句一起使用时优化Oracle CONNECT BY前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在使用同一查询中的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之前可以执行此操作.

猜你在找的MsSQL相关文章