考虑EMP,DEPT示例 在deptno的上下文中查询EMP表是很常见的。如果经常 查询:
select * from dept, emp
where emp.deptno = dept.deptno and dept.deptno = :X;
我在员工表上有一个索引deptNo_idx。但每当我看到执行计划时,从未使用过该指数。甚至给出索引提示也没用;
任何想法如何在外键列上使用索引?
答案 0 :(得分:4)
当您尝试理解优化程序行为时,EMP
和DEPT
表不是特别好的表。它们非常小,以至于优化器会经常正确地确定全表扫描比索引访问更有效。此外,相对较少的不同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);
那应该让它飞起来。