oracle的資料掃描方式
最近這段時間剛好有點空餘的小時間 就索性研究了下oracle的資料掃面方式,由於個人經驗原因一般 顧部落格內容僅供參考
總的來說 我們通常查詢資料的話有以下幾種方式---表掃面 和索引掃描
一、表掃描方式
1、全表掃描 (FULL TABLE SCAN)
2、通過ROWID的表存取(Table Access by ROWID )
二、索引掃描方式
1、索引唯一掃描(index unique scan) (oracle建表時會自動建的ID索引)
例如 :select * from 表名 where id=? 時 就會觸發 此掃描
2、索引範圍掃描(index range scan)
就是表中的欄位 除id外 我們手動建的索引 (預設已經建立欄位1的索引 非id索引)
例如 : select * from 表名 where 欄位1=?
3、索引快速全掃描(index fast full scan) (預設id索引和欄位1索引以建立)
當select 欄位和where後面的條件查詢欄位都出現在索引列裡面的時候 這時就會觸發索引快速全掃描
例如: select w.欄位1 from 表名 w where id=?
4、索引跳躍掃描(在組合索引場景中出現)---通俗點就是 查詢條件含有索引非引導列且 索引引導列的唯一值即count(distinct 引導欄位)相對比較下時
,當謂語中包含索引中非引導列上的條件,並且引導列的唯一值較小的時候,就有極有可能使用索引跳躍掃描方法;同索引全掃描,範圍掃描一樣,它也可以升序或降序的訪問索引;不同的是跳躍掃描會根據引導列的唯一值數目將複合索引分成多個較小的邏輯子索引,引導列的唯一值數目越小,分割的子索引數目也就越少,就越可能達到相對全表掃描較高的運算效率。
另外附上index fast full scan(結果集無序)和index full scan(結果集有序)比較
- 當select和where中出現的列都存在索引是發生index full scan與index fast full scan的前提
- index fast full scan使用多塊讀的方式讀取索引塊,產生db file scattered reads 事件,讀取時高效,但為無序讀取
- index full scan使用單塊讀方式有序讀取索引塊,產生db file sequential reads事件,當採用該方式讀取大量索引全掃描,效率低下