oracle筆記整理11——效能調優之oracle等待事件與表關聯

thinkpadshi發表於2016-01-16

1. oracle等待事件

1) 分類

主要分為兩大類:空閒(idle)等待事件和非空閒(non-idle)等待事件,在會話級別可以在檢視V$SESSION_WAIT中檢視當前等待的時間。

2) 空閒事件

空閒事件指oracle正等待某種工作,不用過多關注。
常見的空閒等待事件:dispatcher timer,pipe get,slave wait,
sql net message from/to client,sql net more data to client

3) 非空閒等待事件

常見的空閒等待事件:

a) db file scattered read:檔案分散多塊讀取
這個事件表明使用者程式正在一次I/O讀多塊資料到Buffer Cache中,等待直到I/O呼叫返回,通常顯示與全表掃描(full table scan / FTS)相關或者IFFS (index fast full scan) 快速索引全掃描(把索引鏈切割成很多份,多塊並行讀取)的等待,當全表掃描時,基於效能的考慮,資料會多塊讀取分散(scattered)讀入buffer cache,出現該事件並不一定就表示存在效能問題,但如果該事件的等待的時間太長,就要仔細檢視了。

b) db file sequential read
單個資料塊/索引塊讀取到連續的記憶體中時會發生,常見於存在索引的情況下,可能存在多表連線,表的連線順序有問題,沒有正確使用驅動表,或者存在不適合的索引,同樣的,出現該事件並不一定就表示存在效能問題,但如果該事件的等待的時間太長,就要仔細檢視了。

c) free buffer:釋放緩衝區
表明系統正在等待記憶體中的可用空間,有可能是低效率的SQL語句、DBWR程式寫快取資料太慢(有可能存在併發操作,dbwr來不及寫入大量的快取資料塊到資料檔案,導致快取空間無法及時釋放 )、緩衝區太小。

2. 表關聯

1) 連線方式

a) 內連線,A inner join B on 即等值連線。
b) 左外連線,A left (outer) join B on / a.id = b.id(+)
c) 右外連線,A right (outer) join b on / a.id(+) = b.id
d) 全外連線,A full (outer) join B

2) 表之間的連線

a) 排序,合併連線(sort merge join,SMJ)
兩表連線時,對兩表結果集進行order by排序,之後進行關聯合並,資料讀操作少,只訪問一次表,但是排序操作開銷太大。

b) 巢狀迴圈(nested loops,NL)
兩表連線就相當於二重迴圈(進而產生了驅動表和被驅動表的概念),會產生大量的讀操作,可以通過索引以及驅動表的選擇來優化;可以先返回已經連線的行,而不必等待所有的連線操作處理完才返回資料,所以返回結果集的響應時間是最快的,當驅動表返回結果集較小且連線列上有索引時,效能最好。

c) 雜湊連線(hash join,HJ)
oracle 引入的 hash 連線, 能夠解決巢狀迴圈連線中大量隨機讀的問題, 同時解決了排序合併連線中排序代價過大的問題,驅動表返回結果集資料量較大時綜合效能最好。大多數情況下,比smj和nl連線方式效能更好。

3) 驅動表(driving table)

又稱為外層表(outer table),所以該表為小表(實際為應用查詢的限制條件之後,返回較少資料集的表)。

4) 被探查表(probed table)

又稱為內層表(inner table),從驅動表中得到具體一行資料之後,在被探查表中尋找符合連線條件的行,所以該表應為大表(實際上為返回較大row source的表)且相應的列上應該有索引。

相關文章