解析Oracle数据扫描Oracle SQL优化引导局部扫描方法(6)(二)

2014-11-24 12:51:00 · 作者: · 浏览: 1
elect deptno from employee like ‘12%’)
And s.sal_date between ‘20100101’ and ‘20101231’
Group by empno) x,employee y
Where y.empno=x.empno;
通过使用rule提示,来使得SQL语句按照索引规则执行,首先执行Select deptno from employee like ‘12%’,获取通过s.deptno字段进行索引过滤的所需的信息。还可以如下方式改写:
Select y.deptno,y.ename,y.empno,y.job,x.sal_tot,x.comm_tot
From(select/*+ index(s inx_dept_sal) */
empno,sum(sal_amt) sal_tot,sum(comm) comm_tot
From salary s www.2cto.com
Where s.deptno in(Select deptno from employee like ‘12%’)
And s.sal_date between ‘20100101’ and ‘20101231’
Group by empno) x,employee y
Where y.empno=x.empno;
两种改写的目的都是保证首先执行小数据量的扫描,进而通过利用索引实现对大数据量表的数据过滤。但是后两种的改写是否会在执行过程中生效,这依赖于不同版本的Oracle执行优化器,因此需要进行确认测试,同时后两种改写也不一定会确保进行局部范围数据扫描,但无论如何第一种方式无疑是有效的。
摘自 javacoffe的专栏