Oracle最佳化筆記訪問索引的方法

來源:互聯網
上載者:User

   索引唯一性掃描(INDEX UNIQUE SCAN)(針對unique index的掃描)比索引範圍掃描(INDEX UNIQUE SCAN)需要的邏輯讀至少少1,這是因為索引唯一行掃描明確只有最多一行資料返回,而索引範圍掃描則可能有多行資料返回,得到第一行資料之後還會向下至少再掃一個葉子節點。

  索引全掃描(INDEX FULL SCAN):索引全掃描不需要掃描該索引的所有分支塊,oracle在做索引全掃描的時候只需要訪問必要的分支塊的定位到位於該索引最左邊的葉子塊的第一行索引行,通過葉子塊之間的雙向指標鏈表就可以互相訪問了。因為是按照從左至右進行掃描的,所以索引全掃描得到的資料是排好序的。索引全掃描一般都是不回表的,例如select count(*) from table; select empno from emp;能做索引全掃描的一個條件就是目標索引至少有一個索引索引值列的屬性是not null。

  索引快速全掃描(INDEX FAST FULL SCAN):和索引全掃描差不多,一般也是不回表的,但也有很多區別。

  和索引全掃描的區別是:

  索引快速全掃描只有在CBO中能用

  索引全掃描不能並存執行,而索引快速全掃描既可以使用多塊讀也可以使用並存執行。

  索引快速全掃描的結果並不一定是有序的。因為索引快速全掃描時Oracle是根據索引行在磁碟上的實體儲存體位置來掃描的,而不是根據索引行的邏輯順序掃描的。

  索引跳躍式掃描(INDEX SKIP SCAN):適合所有類型的複合B樹索引,(包括唯一性索引和非唯一性索引),它使得那些在where條件中沒有針對目標索引的前置列指定查詢條件同時又對該索引的非前置列制定了查詢條件的目標SQL依然能夠使用該索引。

  例如索引建在(gender,eno)兩列,where條件中沒有gender條件只有例如emp=100這種查詢條件依然可以使用該複合B樹索引。

  之所以能用是因為oracle幫我們對sql語句進行了改寫,將前置列加了進來。

  原語句:

  select * from test where eno=100;

  如果此時gender列只有兩個取值F和M,oracle會幫我們把它改寫成

  select * form test where gender='F' and eno=100

  union all

  select * from test where gender='M' and eno=100;

  從此可以看出oracle中的索引跳躍式掃描只適用於那些目標索引前置列的distinct值數量較少,後續非前置列的可選擇性又非常好的情形,因為索引跳躍式掃描的執行效率一定會隨著目標索引前置列的distinct值數量的遞增而遞減。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.