摘要:《Flush Shared Pool》
2009/8/4
已經好幾天公司的重要程式一直被反應載入資料緩慢,有經驗的程式設計師都知道,
"慢" 是一個很主觀的感受,且牽涉的因素有很多,舉些比較粗淺的例子,
可能與使用者的操作方式、程式的寫法、OS的環境、網路的環境及品質、資料庫的狀態有關,
如果是多層次的架構,還牽涉到中間層的環境。
這次一如往常,先假設所有外在環境因素都沒問題,因為只有程式不斷的在改版,
所以從程式著手,調整SQL的語法,直到調無可調...
程式的部份,自覺已經盡力了,在這情形下也不能隨意改變程式的作法架構,
而且這些調整過後的SQL,理應很快的有所反應,但是在程式的表現總是顯得資料庫回應的速度有所瓶頸。
假設沒有其它外在因素的干擾,將SQL 自 Client送到Database的流程想了一下,
SQL -> Database -> Shared Pool 找相同的執行紀劃 -> 如果找不到就重新 Parse -> Buffer Cache 找有沒有已載入的block -> 如果沒有就會作 Physical Disk Read
加上最近在看statspack 的報告,有一項指標引起我的注意,就是 Execute to Parse % ,這是指SQL執行的次數與Parse次數的百分比,
遂將這幾天系統尖峰時刻的報告都跑一份出來比較,果然這兩天的數值表現都不是很好,據Google大神表示這百分比最好不要低於 20%,
我相信接近 20% 也不會是太好的結果吧! 看來系統 Parse 的次數有點不正常,難不成是 Shared_Pool 太小? 但是沒辦法調,因為所有的資源都用上了,
沒有更多餘的記憶體可以配置。
再加上前一陣子有讀到一篇Shared Pool內執行計劃的存放,似乎有提到破碎的記憶體空間會影響執行計劃的存放。
我猜想這也許是造成 Parse 次數過於頻繁的主因。
所以在 8/4 8:45 執行下列指令,將shared pool 清掉。
ALTER SYSTEM FLUSH SHARED_POOL;
很慶幸的在 9:00 ~ 10:00 的STATSPACK REPORT 中得到我想要的結果。
將結果列在下方,跟大家分享這次的經驗。
8/4(二) 7:00~8:00 Execute to Parse %: 24.23
8/4(二) 8:00~9:00 Execute to Parse %: 24.04
8/4(二) 9:00~10:00 Execute to Parse %: 64.15
8/3(一) 7:00~8:00 Execute to Parse %: 22.94
8/3(一) 8:00~9:00 Execute to Parse %: 22.08
8/3(一) 9:00~10:00 Execute to Parse %: 20.72
7/28(二) 7:00~8:00 Execute to Parse %: 40.82
7/28(二) 8:00~9:00 Execute to Parse %: 36.65
7/28(二) 9:00~10:00 Execute to Parse %: 30.26
7/27(一) 7:00~8:00 Execute to Parse %: 37.55
7/27(一) 8:00~9:00 Execute to Parse %: 31.19
7/27(一) 9:00~10:00 Execute to Parse %: 31.33