本節書摘來自華章計算機《oracle資料庫性能優化方法論和最佳實踐》一書中的第2章,第2.2節,作者:柳遵梁 潘敏君 應以峰著,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視
2.2.1 owi優化方法論簡述
owi,是oracle wait interface的簡稱。最開始owi并不是為了性能優化而出現的,而是出于調試的目的,用來明确目前正在發生什麼事情,在oracle 7中它就已經以初級的方式存在了。當oracle 8i極其明确地把owi引入性能優化時,資料庫性能優化方法論就出現了劃時代的飛躍。owi方法論讓oracle第一次跳出部件構成性能的視野,從一個旁觀者的角度或者業務流程的角度來考慮問題,使其與現實世界的基于流程協調的流程優化相符合。
排隊和沖突是現實世界中時時刻刻普遍發生的事件,我們吃飯要排隊、購物要排隊、上車要排隊、看病要排隊,甚至走路都要排隊。如果不想被前面的人或者物堵住,需要不斷地變換通道或者将障礙進行拆除,我們的觀點和行為會不斷地發生沖突。oracle owi方法論充分地認識到了排隊和沖突是生活的主題,是資料庫流程的主題。例如,特别典型的是看醫生,每個人都有切身體會。排隊挂号,排隊看醫生,排隊檢查,排隊拿藥,各種排隊合計3個小時,醫生看病處理不超過5分鐘。隻要可以降低排隊時間,就可以提高效率,降低時間成本。owi就是基于這個樸素的理念的,隻要使各種等待所消耗的時間盡可能低,就可以提高業務系統的性能。對于oracle來說,owi的發展就是盡可能精細地衡量等待事件;對于性能優化者而言,就是發現等待事件的原因并且盡可能降低或者消除它。
owi方法是快速優化oracle性能的最有效方式,owi的精準定位使性能優化不再需要到處進行衡量。某種程度上,owi方法論類似于故障處理的思路,處理焦點在局部,使優化者無需了解業務流程,無需進行全局流程的協調,降低了對性能優化者的能力要求。
至今為止,owi方法依然是最為快速有效的性能優化方法。雖然如此,由于owi關注的局限性,有一些缺陷,使其解決複雜的性能問題時有些力不從心,更多隻作用在突然變化的性能異變上。
owi方法事實上并不是從業務(流程)的角度看問題,而是從cpu的角度看問題,隻要cpu一直處于忙碌之中,就假設性能是優異的。這就忽略了在很多場合下 cpu的處理效率才是性能問題的本源所在。owi方法從本質上與基于局部命中率分析方法類似,都是眼睛向内看。一個是隻要我忙,系統就好;一個是隻要我好,系統就好,總體來說都缺乏流程的概念。owi的使用如此簡單,效果是如此出色,使絕大部分性能優化者不再去關心流程,而僅關心發生性能問題的某一點。owi方法在快速優化性能的同時,事實上割裂了業務流程之間的關系,往往使複雜的性能優化工作顧此失彼。
owi優化工作者總是精心研究常見的oracle等待事件,研究其等待事件可能發生的原因以及對應的解決方案。owi優化方法獲得各個級别dba的厚愛,除了其簡單有效之外,最為重要的原因在于其可以不用過多考慮業務相關問題,隻用采用故障解決的思維邏輯來解決性能優化問題。
2.2.2 owi方法論的可檢測體系
oracle資料庫為基于owt的優化方法論提供了極為完善的可測量體系,且包含極為豐富的不同粒度,從session級别到對象級别到系統級别,從實時資訊到時間點快照,甚至在sql級别也盡可能提供準确的等待事件資訊。
1.?基于session的oracle wait event實時及統計資訊
目前實時的wait event資訊:v$session、v$session_wait、v$session_wait_class。
最近10次的wait event資訊:v$session_wait_history。
100ms到秒級别的快照資訊:v$active_session_history。
時間範圍快照:wrh$_active_session_history。
抽樣:dba_hist_active_sess_history。
啟動以來的事件統計資訊:v$session_event。
2.?基于對象的oracle wait event的資訊
啟動以來對象的實時統計資訊:v$segment_statistics。
時間範圍快照:wrh$_seg_stat。
3.?基于執行個體/全局的oracle wait event的資訊
1)基于執行個體的oracle wait event資訊。
分鐘級别的實時統計資訊:v$eventmtric、v$waitclassmetric。
基于時間範圍快照的統計資訊:wrh$_system_event、wrh$_bg_event_summary、dba_hist_waitstat。
啟動以來的事件統計資訊:v$system_event、$system_wait_class、v$service_event。
2)均衡平均化的事件柱狀體資訊:
啟動以來的等待事件柱狀圖資訊:v$event_histogram。
時間範圍快照的等待事件柱狀圖資訊:wrh$_event_histogram。
3)特定事件的等待事件統計:
啟動以來的buffer busy wait event: v$waitstat。
時間範圍快照的buffer busy wait event: wrh$_waitstat。
4)等待事件的互相連結關系:
等待session之間的等待事件鍊:v$wait_chains(oracle 11g)。
4.?基于sql的等待事件描述
實時的session事件資訊:v$session。
實時的sql級别事件資訊:v$sql_monitor。
100ms~1s級别的事件資訊:v$active_session_history。
基于快照和抽樣:wrh$_active_session_history、dba_hist_wait_history、wrh$_sqlstat。
啟動以來的統計:v$sql、v$sqlarea、v$sqlstat。
2.2.3 owi方法中wait event的發展
oracle資料庫在owi方法上投入了大量的精力,每一個版本的更新都在owi可測量名額體系上做出了持續改進。
oracle 10gr2共有12個事件分類,合計事件數量874個,如圖2-2所示。
oracle 11gr2共有13個事件分類,合計事件數量1116個,如圖2-3所示。
無論是874個等待事件還是1116個等待事件,它們都是一個極為驚人的數字,在缺乏有效背景資料的前提下,幾乎很難對所有等待事件進行研究,這使性能優化者陷入一定的困境。owi方法在這裡真正展現了故障排除的思維邏輯,經驗的積累對于性能優化者來說起到了決定性作用。