【翻译自mos文章】使用索引快速全扫(indexffs)来避免全表扫描
Jun 07, 2016 pm 03:58 PM使用索引快速全扫(index ffs) 来避免全表扫描 参考原文: Index Fast Full Scan Usage To Avoid Full Table Scans (Doc ID 70135.1) 适用于: Oracle Database - Enterprise Edition - Version 7.3.0.0 to 11.2.0.3 [Release 7.3.0 to 11.2] Information i
使用索引快速全扫(index ffs) 来避免全表扫描
参考原文:
Index Fast Full Scan Usage To Avoid Full Table Scans (Doc ID 70135.1)
适用于:
Oracle Database - Enterprise Edition - Version 7.3.0.0 to 11.2.0.3 [Release 7.3.0 to 11.2]
Information in this document applies to any platform.
***Checked for relevance on 2-Dec-2013***
目的:
本文讨论了使用 Index Fast Full Scans (Index FFS) 来避免Full Table Scans (FTS)
范围:
那些遇到 查询走fts而不走index ffs这种情况 的支持分析人员和客户
细节:
什么时候index ffs 优先于fts 被使用?
从Oracle8 Server Concepts manual:
1.索引必须包括所有的在查询中出现的列(确切的说是要么 出现在select之后,要么 出现在where 之后)。
2.index ffs 只适用于cbo
3.Index FFS 对应的hint为 /*+ INDEX_FFS() */
index ffs是在oracle 7.3中被引入的。
在oracle 7中,需要把初始化参数V733_PLANS_ENABLED设置为true
一个index ffs 将会扫描index中的所有blocks。返回的数据是不排序的。
index ffs 可以使用多块I/O,也可以像 fts那样使用并行。
例子:
使用 the standard emp and dept tables 来举例
准备工作:创建一个复合索引
create index emp_ix on emp(empno, deptno, ename);
第一种情况:查询一个单表,该查询的 select语句之后有索引中的全部列:
SQL> select /*+ INDEX_FFS (emp emp_ix) */ empno, deptno, ename from emp;
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=4 Card=21 Bytes=693)
1 0 INDEX (FAST FULL SCAN) OF 'EMP_IX' (NON-UNIQUE) (Cost=4 Card=21 Bytes=693)
第二种情况:查询一个单表, 组成index的列,要么 出现在select之后,要么 where 之后
SQL> select /*+ INDEX_FFS (emp emp_ix) */ empno, ename from emp where deptno > :bind1;
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=4 Card=2 Bytes=66)
1 0 INDEX (FAST FULL SCAN) OF 'EMP_IX' (NON-UNIQUE) (Cost=4 Card=2 Bytes=66)
第三种情况:查询中有构成index的所有列和没在index中的列
SQL> select /*+ INDEX_FFS (emp emp_ix) */ empno, ename from emp where deptno > :bind1 and sal <:bind2>
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=1 Bytes=46)
1 0 TABLE ACCESS (FULL) OF 'EMP' (Cost=1 Card=1 Bytes=46)
Note: CBO 优化器选择了 FTS,原因是 INDEX FFS不能满足 all columns in query 这个要求。
--->可以看出,虽然用了hint,但是执行计划依然不走index ffs,而是走了TABLE ACCESS (FULL)。原因很简单:走了index ffs就得不到正确的结果。
第四种情况:构成复合索引的列,包括在查询中。
SQL> select /*+ INDEX_FFS (emp emp_ix) */ ename from emp;
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=4 Card=21 Bytes=147)
1 0 INDEX (FAST FULL SCAN) OF 'EMP_IX' (NON-UNIQUE) (Cost=4 Card=21 Bytes=147)
NOTE: INDEX FFS still chosen if subset of index columns in query
第五种情况:查询包括关联(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 Optimizer=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=4Card=21 Bytes=420)
3 1 TABLE ACCESS (FULL) OF 'DEPT' (Cost=1 Card=21 Bytes=462)
--->可以看到,对emp表(即:e表),也是能走index ffs

인기 기사

인기 기사

뜨거운 기사 태그

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











크리스탈디스크마크란 어떤 소프트웨어인가요? -크리스탈디스크마크는 어떻게 사용하나요?

오늘 Toutiao에 기사를 게시하여 어떻게 돈을 벌 수 있나요? 오늘 Toutiao에 기사를 게시하여 더 많은 수입을 얻는 방법!

foobar2000을 어떻게 다운로드하나요? - foobar2000 사용법

Xiaoai 스피커 사용 방법 Xiaoai 스피커를 휴대폰에 연결하는 방법

iOS 17.4 '도난 기기 보호'의 새로운 고급 기능을 사용하는 방법을 가르쳐주세요.

BTCC 튜토리얼: BTCC 교환에서 MetaMask 지갑을 바인딩하고 사용하는 방법은 무엇입니까?
