使用索引快速全掃描(Index FFS)避免全表掃描的若干場景
使用索引快速全掃描(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。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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 索引全掃描和索引快速全掃描的區別索引
- (轉)索引掃描還是全表掃描(Index Scan Or Full Table Scan)索引Index
- 轉)索引掃描還是全表掃描(Index Scan Or Full Table Scan)索引Index
- MySQL中的全表掃描和索引樹掃描MySql索引
- Oracle中存取資料掃描Table及索引的方式(全表掃描,索引掃描等)Oracle索引
- oracle優化:避免全表掃描Oracle優化
- oracle 全表掃描,索引範圍掃描與塊的理解Oracle索引
- mysql下建立索引讓其index全掃描MySql索引Index
- 【MySQL】全索引掃描的bugMySql索引
- 優化全表掃描優化
- delete 與全表掃描delete
- 索引掃描可能不如全表掃描的場景的理解__純粹資料量而言,不涉及CLUSTERING_FACTOR索引
- ORACLE全表掃描查詢Oracle
- 查詢全表掃描的sqlSQL
- 有索引卻走全表掃描的實驗分析索引
- 查詢全表掃描語句
- @dbsnake-用合適的函式索引來避免看似無法避免的全表掃描函式索引
- 全表掃描的cost 與 索引掃描Cost的比較 – 無直方圖(10.1.0.3以後)索引直方圖
- oracle實驗記錄(分割槽全表掃描(全區掃描) FTS 時候的成本計算)Oracle
- oracle是如何進行全表掃描的Oracle
- 優化Oracle with全表掃描的問題優化Oracle
- delete 刪除資料 全表掃描還是掃描所有塊的測試delete
- 抓取全表掃描的表,篩選和分析
- 使用全表掃描快取大表的相關問題快取
- 一條全表掃描sql語句的分析SQL
- 優化Oracle with全表掃描的問題(二)優化Oracle
- 24_Oracle資料庫全表掃描詳解(四)_全表掃描生產最佳化案例三則Oracle資料庫
- 使用10046 event trace跟蹤全表掃描操作
- 隱形轉換導致全表掃描案例
- noworkload下全表掃描cost的計算
- 索引唯一性掃描(INDEX UNIQUE SCAN)索引Index
- 【Oracle】 索引的掃描方式Oracle索引
- Oracle JDBC驅動使用setDate()、setTimestamp()導致全表掃描OracleJDBC
- oracle sql tuning 8--優化全表掃描OracleSQL優化
- 關於分割槽表中的全partition掃描問題
- 跳躍式索引掃描(index skip scan) [final]索引Index
- Greenplum儲存過程使用分割槽表將進行全表掃描儲存過程
- 使用索引掃描來進行排序索引排序