当前位置:操作系统 > Unix/Linux >>

使用索引快速全扫描(Index FFS)避免全表扫描的若干场景

使用索引快速全扫描(Index FFS)避免全表扫描的若干场景
 
什么使用使用Index FFS比FTS好?
Oracle 8的Concept手册中介绍:
1. 索引必须包含所有查询中参考到的列。
2. Index FFS只能通过CBO(Index hint强制使用CBO)获得。
3. Index FFS使用hint:/*+ INDEX_FFS() */。
 
Index FFS是在7.3中引入的。在Oracle 7中,它要求初始化参数V733_PLANS_ENABLED的值需要是TRUE。
Index FFS将会扫描索引的全部块。返回的数据不会存储。Index FFS能够使用多块IO读,可以并行执行,就像全表扫描那样。
 
实例:
使用Oracle 8.0.5中标准的emp和dept表(可以使用UTLSAMPL.SQL创建),不建立任何表的统计数据或索引。使用autotrace产生执行计划。
准备工作:创建一个复合索引
 
create index emp_ix on emp(empno, deptno, ename);

 

 
查询单个表,查询出索引的全部列:
SQL> select /*+ INDEX_FFS (emp emp_ix) */ empno, deptno, ename from emp;
Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT ptimizer=CHOOSE (Cost=4 Card=21 Bytes=693)
   1    0   INDEX (FAST FULL SCAN) OF 'EMP_IX' (NON-UNIQUE) (Cost=4 Ca
          rd=21 Bytes=693)

 

 
 
查询单个表,索引列放在select或where子句中:
 
SQL>  select /*+ INDEX_FFS (emp emp_ix) */ empno, ename from emp 
      where deptno > :bind1;
Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT ptimizer=CHOOSE (Cost=4 Card=2 Bytes=66)
   1    0   INDEX (FAST FULL SCAN) OF 'EMP_IX' (NON-UNIQUE) (Cost=4 Ca
          rd=2 Bytes=66)

 

 
查询索引的所有列,以及不再索引中的列:
SQL> select /*+ INDEX_FFS (emp emp_ix) */ empno, ename from emp 
     where deptno > :bind1 and sal <:bind2;
Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT ptimizer=CHOOSE (Cost=1 Card=1 Bytes=46)
   1    0   TABLE ACCESS (FULL) OF 'EMP' (Cost=1 Card=1 Bytes=46)

 

注意:CBO选择FTS,因为Index FFS不能满足查询所有列。
 
 
查询复合索引中的部分列:
SQL> select /*+ INDEX_FFS (emp emp_ix) */  ename from emp;
Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT ptimizer=CHOOSE (Cost=4 Card=21 Bytes=147)
   1    0   INDEX (FAST FULL SCAN) OF 'EMP_IX' (NON-UNIQUE) (Cost=4 Ca
          rd=21 Bytes=147)

 

注意:如果查询中是索引列的子集,仍会选择Index FFS。
 
 
包含join的查询;
 
SQL> select  /*+ INDEX_FFS ( e emp_ix) */  e.ename, d.dname 
     from emp e , dept d
     where e.deptno=d.deptno;


Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT ptimizer=CHOOSE (Cost=6 Card=4 Bytes=168)
   1    0   HASH JOIN (Cost=6 Card=4 Bytes=168)
   2    1     INDEX (FAST FULL SCAN) OF 'EMP_IX' (NON-UNIQUE) (Cost=4
          Card=21 Bytes=420)
   3    1     TABLE ACCESS (FULL) OF 'DEPT' (Cost=1 Card=21 Bytes=462)

 


CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,