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

bisal發表於2013-10-13

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

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7192724/viewspace-774298/,如需轉載,請註明出處,否則將追究法律責任。

相關文章