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

简介: 使用索引快速全扫描(Index FFS)避免全表扫描(FTS)(文档 ID 70135.1)什么使用使用Index FFS比FTS好?Oracle 8的Concept手册中介绍:1. 索引必须包含所有查询中参考到的列。

使用索引快速全扫描(Index FFS)避免全表扫描(FTS)

(文档 ID 70135.1)


什么使用使用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)
目录
相关文章
|
SQL 关系型数据库 MySQL
使用索引消除group by 排序
ySQL数据库在使用group by查询时默认会进行排序,有时候我们并不需要这种排序,消除这种排序有两种方式,本文介绍其中一种,即使用索引消除排序,这种方式还有一个附加的好处,就是避免临时表的创建。
559 0
|
10月前
|
数据库 索引
索引是越多越好嘛? 什么样的字段需要建索引
索引的作用是加快数据库的查询速度,但并不是索引越多越好。过多的索引会增加数据库的存储空间和维护成本,并且在写操作时可能会降低性能。
157 0
|
存储 索引
为什么范围后索引会失效 存储引擎不能使用索引中范围条件右边的列
比如说有三个字段 a b c,建立复合索引a_b_c。此时叶子节点的数据排序后可能为
72 0
|
存储 SQL 关系型数据库
【名词解释与区分】聚集索引、非聚集索引、主键索引、唯一索引、普通索引、前缀索引、单列索引、组合索引、全文索引、覆盖索引
【名词解释与区分】聚集索引、非聚集索引、主键索引、唯一索引、普通索引、前缀索引、单列索引、组合索引、全文索引、覆盖索引
226 1
【名词解释与区分】聚集索引、非聚集索引、主键索引、唯一索引、普通索引、前缀索引、单列索引、组合索引、全文索引、覆盖索引
|
存储 SQL 关系型数据库
什么是索引覆盖?什么是索引下推?
什么是索引覆盖?什么是索引下推?
312 0
什么是索引覆盖?什么是索引下推?
|
存储 SQL 缓存
B+树索引使用(9)分组、回表、覆盖索引(二十一)
B+树索引使用(9)分组、回表、覆盖索引(二十一)
|
存储 SQL 关系型数据库
如何优雅的给字段加索引,能引导优化器走索引?
大家好前面我们大概了解了MySQL为什么会选错索引。今天介绍一下如何巧妙的给字符串字段加索引提高查询性能。
如何优雅的给字段加索引,能引导优化器走索引?
|
算法 关系型数据库 MySQL
mysql索引(九)索引合并
索引合并是mysql底层为我们提供的智能算法。了解索引合并的算法,有助于我们更好的创建索引。 索引合并是通过多个range类型的扫描并且合并它们的结果集来检索行的。仅合并来自单个表的索引扫描,而不是跨多个表的索引扫描。合并会产生底层扫描的三种形式:unions(合并)、intersections(交集)、unions-of-intersections(先取交集再合并)。
273 0
mysql索引(九)索引合并
|
索引
索引分类、创建索引、删除索引
索引分类、创建索引、删除索引
120 0
索引分类、创建索引、删除索引
|
SQL 关系型数据库 数据库
PostgreSQL 设计优化case - 大宽表任意字段组合查询索引如何选择(btree, gin, rum) - (含单个索引列数超过32列的方法)
标签 PostgreSQL , adhoc查询 , 大宽表 , 任意字段组合查询 , 索引 , btree , gin , rum 背景 大宽表,任意字段组合查询,透视。是实时分析系统中的常见需求: 1、实时写入。
2507 0