索引快速掃描(index fast full scan)


一、索引快速掃描(index fast full scan)

索引快速全掃描(INDEX FAST FULL SCAN)和索引全掃描(INDEX  FULL SCAN)極為類似,它也適用於所有類型的B樹索引(包括唯一性索引和非唯一性索引)。和索引全掃描一樣,索引快速全掃描也需要掃描目標索引所有葉子塊的所有索引行。

索引快速全掃描與索引全掃描相比有如下三點區別。

(1)索引快速全掃描只適用於CBO。

(2)索引快速全掃描可以使用多塊讀,也可以並行執行。

(3)索引快速全掃描的執行結果不一定是有序的。這是因為索引快速全掃描時Oracle是根據索引行在磁盤上的物理存儲順序來掃描,而不是根據索引行的邏輯順序來掃描的,所以掃描結果才不一定有序(對於單個索引葉子塊中的索引行而言,其物理存儲順序和邏輯存儲順序一致;但對於物理存儲位置相鄰的索引葉子塊而言,塊與塊之間索引行的物理存儲順序則不一定在邏輯上有序)。

Fast full index scans are an alternative to a full table scan when the index contains all the columns that are needed for the query(組合索引中的列包含了需要查詢的所有列), and at least one column in the index key has the NOT NULL constraint(至少有一個有非空約束). A fast full scan accesses the data in the index itself, without accessing the table. It cannot be used to eliminate a sort operation, because the data is not ordered by the index key. It reads the entire index using multiblock reads, unlike a full index scan, and can be parallelized.

You can specify fast full index scans with the initialization parameter OPTIMIZER_FEATURES_ENABLE or the INDEX_FFS hint. Fast full index scans cannot be performed against bitmap indexes.

A fast full scan is faster than a normal full index scan in that it can use multiblock I/O(一次可以讀多個塊,跟全表掃描一樣) and can be parallelized just like a table scan.

二、例子

1、針對scott的emp表

select empno from emp;

clip_image001

繼續插入數據

BEGIN

FOR I IN 0..1000 LOOP

INSERT INTO EMP(EMPNO,ENAME) VALUES(

I,CONCAT('TBL',I));

END LOOP;

END;

對表EMP及主鍵索引重新收集一下統計信息:

analyze table emp compute statistics for table for all columns for all indexes;

重新執行

select empno from emp;

clip_image002

加載策略變成了Fast Full Index Scans

 

三、對比Index Fast Full Scans與Index Fast Full Scans

INDEX FULL SCAN 與 INDEX FAST FULL SCAN兩個長相差不多,乃是一母同胞,因此既有其共性,也有其個性。兩者來說其共性是不用掃描
表而是通過索引就可以直接返回所需要的所有數據。這對提高查詢性能而言,無疑是一個難得的數據訪問方式之一,因為索引中存儲的數據通常
是遠小於原始表的數據。下面具體來看看兩者之間的異同。

我們對比一下 Index Fast Full Scans與Index Fast Full Scans

select /*+ index_ffs(emp pk_emp) */empno from emp;

clip_image003

select /*+ index(emp pk_emp) */empno from emp;

clip_image004

和index full scan不同,index fast full scan的執行結果並沒有按照主鍵索引PK_EMP的索引鍵值前導列EMPNO來排序,即索引快速全掃描的執行結果確實不一定是有序的。

四、結論

  • 當select和where中出現的列都存在索引是發生index full scan與index fast full scan的前提
  • index fast full scan使用多塊讀的方式讀取索引塊,產生db file scattered reads 事件,讀取時高效,但為無序讀取
  • index full scan使用單塊讀方式有序讀取索引塊,產生db file sequential reads事件,當采用該方式讀取大量索引全掃描,效率低下

參考

INDEX FULL SCAN vs INDEX FAST FULL SCAN

索引快速全掃描


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM