1. 程式人生 > >oracle索引簡單記錄

oracle索引簡單記錄

資料庫(database)是由若干表空間(tablespace)組成。
表空間分為以下:系統表空間、臨時表空間、回滾表空間、資料表空間
tablespace是由若干段(segment)組成,segment又由若干區(extent)組成,區又由最小單位(block)組成。表空間、段、區、塊。一般建立的表:用幾個區組成。
oracle最小擴充套件單位是區(extent),最小邏輯單位是塊(block),預設大小是8kb。






索引的三大特點
1.索引樹的高度一般比較低
2.索引由索引列儲存的值及rowid組成
3.索引本身是有序的




索引的高度一樣,500萬條資料5000萬條資料,如果根據id去查,產生的io次數是一樣的,查詢的時間也是一樣的。

查詢的資料量比較大,不建議走索引,因為根據索引查詢,查一條資料要3到4次io,再乘以記錄數,還不如走全表掃描

全表掃描是讀取一個塊、一個塊讀取的。(所以訪問資料量比較大,更不建議走索引)。


為什麼大表拆小表查詢快?

表儲存的最小單位是block,讀取的時候是一個一個block讀取,小表io讀減少。

什麼是邏輯讀?
就是一個block一個block的讀
索引列為空對走索引有影響解決辦法:
1.告訴資料庫該列不為空
2.建立該欄位的時候,告訴資料庫該欄位不為空
3.如果是主鍵則不會產生該問題


索引掃描型別?
index full scan  (min/max),一次讀取一個塊,可以保證有序(max min 顯然是有序,union  )
index range scan 
index fast full scan (sum/avg/count),一次讀取所有的塊,不保證有序(count sum不需要保證有序,union all)


select min(id),max(id) from t的寫法能用到索引嗎?
分成兩條語句讀select maxValue,minValue from(select max(id) as maxValue from t) a,(select min (id) as minValue from t)b


消除table access by index rowid
select * from t where t=1 (需要回表讀)
select id from t where t=1 (消除了回表讀的操作)
如果業務需要,可以建立組合索引進行優化,比如:select id,name from t,把id,name建立成組合索引。
聯合索引的建立勢必會讓block變多,組合索引的列不宜超過3個


set autotrace on 跟蹤查詢計劃


聚合因子:
10條資料放在一個block,聚合因子比較低
10條資料放在10個block,聚合因子比較高

create table 是不走快取,所以比insert into 快很多

排序主要是消耗在cpu上,如果pga無法容納排序的資料,將在磁碟上排序,效能消耗更大。
使用索引可以消除排序,但是查出大量的資料的時候,走索引是通過回表讀所以產生的io的消耗更大。產生的邏輯讀會比沒建立索引大很多。如果可以消除回表都消耗更小。


distinct 採用的是HASHUNIQUE的演算法,distinct也會產生排序

組合索引建立的規則:
1.(col1,col2) 查詢時select * from t where col=xx and col2=xx,無論col1和col2在前後,其實都是一樣的效果。
2.(co1,col2)  查詢時select * from t where col=xx and col2>xx ,這種情況col1在前效率更高


聯合索引的前一列不需要建立索引

alter index 索引名 monitoring usage; 
通過觀察v$object_usage 進行跟蹤
select * from v$object_usage;

避免列運算讓索引失效,如果真的有需要,可以考慮建立函式索引

點陣圖索引和b樹索引最大的區別。
葉子節點儲存的是 每一條記錄的狀態,標記為0或者1 比如5條記錄,前面兩條是男:男 11000
點陣圖索引的記錄格式是:
鍵值
開始rowid:
結束rowid
對應數值。

採用點陣圖索引,一個鍵指向多行,可能數以百計甚至更多。如果更新一個位圖索引鍵,那麼這個鍵指向的數百條記錄會與你實際更新的那一行一同被有效地鎖定。
所以,如果有人插入一條新記錄(PROCESSED_FLAG列值為N),就會鎖定點陣圖索引中的N鍵,而這會有效地同時鎖定另外數百條PROCESSED_FLAG列值為N的記錄(以下記作N記錄).