Oracle-11g
執行計劃使用B+樹索引,也排序
我正在使用 Oracle
sqlplus
。我有以下查詢:SELECT fooID from foo MINUS SELECT fooID from bar;
我創建了兩個非聚集 B+ 樹索引。一個在表的欄位
fooID
中foo
,一個在表的欄位fooID
中bar
。之後,我分析了兩個表的統計資訊:foo
並bar
使用EXPLAIN PLAN ...
. 但我明白了:SELECT STATEMENT MINUS SORT UNIQUE INDEX FAST FULL SCAN FOO_INDEX SORT UNIQUE INDEX FAST FULL SCAN BAR_INDEX
這怎麼可能呢?做
INDEX FAST FULL SCAN
的時候,因為索引是B+樹,系統不會找回它的元組排序嗎?為什麼需要這樣做SORT UNIQUE
(數據已經排序)?
Oracle 說全索引掃描下的索引和索引組織表:在全索引掃描中,數據庫按順序讀取整個索引。
然而,在快速全索引掃描下,它寫道: 快速全索引掃描是一種全索引掃描,其中數據庫訪問索引本身中的數據而不訪問表,並且數據庫以不特定順序讀取索引塊。(強調我的)
現在,問題可能應該是:為什麼優化者選擇
INDEX FAST FULL SCAN
了INDEX FULL SCAN
.在11.2.3.7 Fast Full Index Scans下給出了後一個問題答案的提示:快速完整掃描比普通的完整索引掃描更快,因為它可以使用多塊 I/O 並且可以像表一樣並行執行掃描。
[如果您堅持 Oracle 使用全索引掃描,您可能想嘗試以下
/*+ index() */
提示:create table tq84_foo ( fooID number not null ); create table tq84_bar ( fooID number not null ); create unique index ix_foo on tq84_foo(fooID); create unique index ix_bar on tq84_bar(fooID); explain plan for select /*+ index(f ix_foo) */fooID from tq84_foo f MINUS select /*+ index(b ix_bar) */ fooID from tq84_bar b; select * from table(dbms_xplan.display);
導致
------------------------------------------------------------------------------ | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------ | 0 | SELECT STATEMENT | | 1 | 26 | 4 (75)| 00:00:01 | | 1 | MINUS | | | | | | | 2 | SORT UNIQUE NOSORT| | 1 | 13 | 2 (50)| 00:00:01 | | 3 | INDEX FULL SCAN | IX_FOO | 1 | 13 | 1 (0)| 00:00:01 | | 4 | SORT UNIQUE NOSORT| | 1 | 13 | 2 (50)| 00:00:01 | | 5 | INDEX FULL SCAN | IX_BAR | 1 | 13 | 1 (0)| 00:00:01 | ------------------------------------------------------------------------------ ```](http://docs.oracle.com/cd/E11882_01/server.112/e16638/optimops.htm#PFGRF94611)