【发布时间】:2010-11-08 01:40:15
【问题描述】:
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 第 2 版中,查询 B 的性能确实比 A 好得多。
您是否针对CONNECT BY 和WHERE 子句进行了类似的性能优化?你如何解释查询 B 比查询 A 做得更好?
【问题讨论】:
-
显示解释计划,甚至可能是跟踪文件,你有什么样的索引?无论如何,我认为您自己已经解释了为什么 B 更快,B 更快是因为首先评估了 where。
-
null 值没有放在索引中,因此也许您可以将 null 的含义替换为 0 或 -1 或类似的值以允许索引工作。
-
@tuinstoel - 是的,看起来减少 CONNECT BY 操作的数据集比减少 START WITH 的初始集更好。我更多地考虑各种优化方法:我尝试在 CONNECT BY 中使用约束,但这没有成功。
-
你更新数据了吗?使用直方图统计
标签: sql performance oracle select query-optimization