標籤:orace索引
索引唯一掃描:是針對唯一性索引大掃描,它僅僅適用於where條件裡是等值查詢的目標SQL,因為掃描的對象是唯一性索引,只掃描索引高度這麼多個索引塊就停止了,索引的唯一掃描的結果至多隻返回一條記錄,索引的唯一掃描,掃描索引高度-2個分支塊,永遠只掃描一個葉子塊。
索引範圍掃描:索引範圍掃描,掃描索引高度-2個分支快,要掃描N多葉子塊,取決於where條件,索引範圍掃描是單塊讀,因為實體儲存體是不連續的。select * from test where id<=1000;訪問路徑:ROOT -B1 -L1 -L7
索引是排序的,從左至右升序排,最左最小,最右做大,索引預設從左向右掃描,也可以加hint倒著掃描:
SQL> select /*+ index_desc(test) */*from test where object_id<=20;19 rows selected.Execution Plan----------------------------------------------------------Plan hash value: 1069979465---------------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |---------------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 19 | 3933 | 3 (0)| 00:00:01 || 1 | TABLE ACCESS BY INDEX ROWID | TEST | 19 | 3933 | 3 (0)| 00:00:01 ||* 2 | INDEX RANGE SCAN DESCENDING| IDX_ID | 19 | | 2 (0)| 00:00:01 |---------------------------------------------------------------------------------------
3.索引的葉子塊只存rowid和列的索引值,比表的資料區塊存的更多的值,
select object_id from test where object_id<100;
select object_id from test where object_id<1000
效能是一樣的,索引掃描最大問題在於回表,如果回表再過濾,就最坑爹了,錯誤的INDEX RANGE SCAN,返回資料很多和大量回表
4.反鍵索引,
如果用sequence作為主鍵,如果insert資料,會不斷更新右邊的葉子塊,dml操作,同一個塊,同時只有一個進程去持有,CBC持有,latch: cache buffers chains,在高並發的insert環境中,sequence主鍵很容易產生熱點塊,解決辦法,把主鍵處理成隨機的,比如手機號或者***號,如果已經用sequence,可用反轉索引把葉子塊打亂來解決。另外一種解決辦法:sid+sequence+pid,反鍵索引多範圍掃描影響大。
5. INDEX SKIP SCAN 索引跳躍掃描。單塊讀 只可能發生在複合式索引上,引導列(複合式索引第一列)沒有包含在where條件中,並且引導列基數很低。INDEX SKIP SCAN 一般來說只會返回少量資料,如果返回大量資料,說明該執 行計劃可能有問題,也就是說索引建立不對。等待事件:db file sequential read HINT: INDEX_SS(表名/別名 索引名)
Oracle索引掃描