select index oracle,使用索引快速全扫描(Index FFS)避免全表扫描的若干场景-Oracle

使用索引快速全扫描(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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值