Oracle-11g

執行計劃使用B+樹索引,也排序

  • December 21, 2011

我正在使用 Oracle sqlplus。我有以下查詢:

SELECT fooID from foo MINUS
SELECT fooID from bar;

我創建了兩個非聚集 B+ 樹索引。一個在表的欄位fooIDfoo,一個在表的欄位fooIDbar。之後,我分析了兩個表的統計資訊:foobar使用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 SCANINDEX 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)

引用自:https://dba.stackexchange.com/questions/9498