在连接查询中未选择外键索引

时间:2011-07-05 07:08:37

标签: sql oracle10g

考虑EMP,DEPT示例  在deptno的上下文中查询EMP表是很常见的。如果经常 查询:

select * from dept, emp
 where emp.deptno = dept.deptno and dept.deptno = :X;

我在员工表上有一个索引deptNo_idx。但每当我看到执行计划时,从未使用过该指数。甚至给出索引提示也没用;

任何想法如何在外键列上使用索引?

2 个答案:

答案 0 :(得分:4)

当您尝试理解优化程序行为时,EMPDEPT表不是特别好的表。它们非常小,以至于优化器会经常正确地确定全表扫描比索引访问更有效。此外,相对较少的不同DEPTNO值,因此优化器知道它必须从EMP表中获取相对较大百分比的行。由于表中的行很少,并且您需要为任何给定的DEPTNO值获取大部分行,因此表扫描将更有效。

如果表格较大且部门较多,优化程序更有可能确定使用索引会更有效。

答案 1 :(得分:0)

A)更改语法以使用正确的连接:

select *
from dept
join emp on emp.deptno = dept.deptno
where dept.deptno = :X;

B)在dept.deptno上定义一个索引,因为那是主过滤器(where子句)

CREATE INDEX DEPT_DEPTNO_IDX ON DEPT(DEPTNO);

那应该让它飞起来。