本節書摘來自華章計算機《oracle資料庫性能優化方法論和最佳實踐》一書中的第2章,第2.1節,作者:柳遵梁 潘敏君 應以峰著,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視
oracle資料庫在開發和使用過程中對資料庫的性能優化極為重視,幾乎在每個版本的更新中都會對可優化的資料庫做出改善。不僅如此,oracle資料庫還會使用優化方法來指導性能優化,會不斷推出新的性能優化方法論,并依據優化方法論持續完善其可觀察的性能優化體系。
從oracle 6到現在的oracle 12c,經曆了oracle 7、oracle 8、oracle 8i、oracle 9i & r2、oracle 10gr1 & r2、oracle 11gr1 & r2和oracle 12c等版本的更新。從oracle 7開始奠定oracle的江湖地位,oracle 8開始超越,到oracle 8i的大紅大紫,以及oracle 9i以來的持續保持和發展,每個版本都有其特色和定位。在oracle的主要發展版本中可以看到oracle性能優化方法論的持續發展。oracle 7中成熟的命中率分析方法,oracle 8開始出現owi(oracle wait interface)的影子,到oracle 8i,owi開始走向前台并快速成熟起來。由于owi方法的簡單實用,目前它是oracle性能優化方法論中的主流。oracle 8i能大紅大紫應該有owi方法的貢獻。從oracle 8i開始,oracle的性能優化方法論遠遠超過了其他同類的資料庫,oracle真正成為性能優化就緒的資料庫。oracle 9i開始出現tba(time based analyze)和基線管理,并在oracle 10g版本中成熟,在oracle 11g版本中持續完善。從oracle 10g開始,oracle認識到平均化的負面影響,使性能檢測資料的粒度越來越細緻,已經可以快速發現平均化可能面臨的問題。
oracle 11gr2中的tba性能分析方法論還不太成熟,但是tba方法已經在一些複雜的性能優化案例中展現出了威力。除tba之外,craig shallahamer提出了uowtba(unit of work time based analyze)方法論,筆者認為uowtba是tba方法的重大改善,可使tba方法被真正有效地使用。本書将以uowtba方法為基礎,提出了基于流程、資源群組件的綜合性能優化方法論,建構了全新的oracle資料庫性能優化的可測量體系。
案例描述:某市工商局的綜合業務處理系統報告長期以來在業務忙碌的時候運作緩慢。筆者指導客戶生成awr報告,發現cache hit ratio隻有72%,top 5 wait主要為db f?ile sequence read和db f?ile scattered read。檢查sga buffer cache配置,隻有375mb。簡單增加buffer cache到2gb,所有性能問題都消失。
在目前,一個性能優化工作者遇到上述案例的性能優化需求,與中彩票類似,一般隻有在菜鳥安裝的資料庫中才會存在。
基于命中率的分析方法是一個古老的性能優化方法論,不僅是在oracle資料庫中,在sybase、db2等資料庫,甚至在任何it裝置中都存在基于命中率的分析方法。對于oracle資料庫而言,局部命中率的分析方法基于以下樸素的觀點:如果構成系統的每個零件都表現優異,那麼整個系統的表現也是優異的。當然,任何具有流程知識的人員都知道以上觀點是不可靠的。
如圖2-1所示,以我們的經驗來看,其中b路段會成為高吞吐量場景中的瓶頸,會導緻整條馬路的車流不暢(那是因為有全局觀點了)。但是,如果站在b路段内部來看問題,即使在業務最高峰的時候,b路段也表現出運作非常流暢,吞吐量表現極好,也許會成為表現最好的路段(如臭名昭著的新嶺隧道,有興趣的讀者可以上網搜尋一下)。基于命中率的分析方法與b路段的觀察者和管理者一樣,它隻關心内部的表現或者自己的表現。
命中率的分析方法作用于性能優化,具有以下緻命的缺陷。
命中率分析僅關注和作用于自身,不關心外部資訊。
這裡以馬路收費站作為例子,命中率分析方法僅關心通過收費站的吞吐量是否正常,而看不到等待穿過收費站的長長的隊伍。從命中率的觀點出發,隻要收費站操作順利,不出現故障,即使隊伍排成10km的長龍也是性能優異的。
命中率分析方法通過全局平均化模糊了個體,而大部分性能問題都是基于個體的。
比如某個心外科手術醫生對于心髒搭橋手術的成功率為98%,每年做500例手術,但是對于那10個落在2%的病人來說成功率就不是98%,而是100%丢了性命。
盡管命中率分析方法明顯不可靠,但由于其擷取資料的成本低廉以及易于了解,也具備描述目标基本性能的能力,事實上,它已成為it裝置甚至生活中工作性能的标準描述方法。對于命中率分析方法,我們可以這樣來描述它:命中率分析結果優秀,不能保證業務系統或者資料庫具有優異的性能;命中率分析結果不好,基本可以确認業務系統或者資料庫不具備優異的性能。在oracle性能優化中,命中率分析方法不足以成為獨立工作的方法論,但必須成為輔助分析的一部分,隻有確定oracle每一個部件自身的工作表現優異才可以使業務性能表現優異,oracle的某個部件工作表現不正常,幾乎可以斷定業務性能不會反應良好。事實上,我們隻要把視野擡高一寸,把自身部件和裝置作為全局流程處理過程中的一個節點,自然就會把輸入和輸出作為衡量自身部件和裝置的重要衡量因素,進而使古老的命中率分析方法依然在最新的性能優化時代發揮出其固有的作用。
命中率可以展現在不同的顆粒度上,如系統全局層、會話層、對象層和sql層等。下面以buffer cache命中率來說明命中率分析的不同層次。
計算公式:buffer cache hit ratio = logical reads/ (logical reads + physical reads)
系統全局層:v$sysstat或者v$buffer_pool_statistics
會話層:v$sesstat或者v$sessio對象層;v$segstat或者v$segment_statistics
sql層:v$sqlarea
具體到某session的一條sql或某一時間段的命中率,還可以通過sql trace或者10046跟蹤得到,如下: