zoukankan      html  css  js  c++  java
  • 【从翻译mos文章】采用高速全扫描索引(index ffs) 为了避免全表扫描

    采用高速全扫描索引(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)。原因非常easy:走了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

  • 相关阅读:
    【PKUSC2019】线弦图【计数】【树形DP】【分治FFT】
    【PKUSC2019】树染色【线段树合并】【树形DP】
    [LibreOJ 3124]【CTS2019】氪金手游【容斥原理】【概率】【树形DP】
    [LibreOJ 3119]【CTS2019】随机立方体【计数】【容斥】
    SQLServer DBA 三十问(加强版)
    解决The valid characters are defined in RFC 7230 and RFC 3986错误问题
    Oracle 11g AWR 系列五:如何生成 AWR 报告?
    转 抽象类和接口联系与区别
    [转][solr]
    【转】org.jdom.IllegalDataException: The data ""is not legal for a JDOM attribute: 0xb is not a legal 异常
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4866774.html
Copyright © 2011-2022 走看看