最近常常接觸 AWR 報表分析,想說AWR已經有儲存資料庫運作歷史資訊,為何不依據裡頭的紀錄資訊進行效能分析呢?因此開始著手研究如何將AWR的資料呈現出趨勢資料~
觀察重點 #
- 當 % Non-Parse CPU 低於 80% 時,代表資料庫忙於解析而非執行,這時增加 CPU 核心也無法根本解決問題。
- 觀察 Per Transaction 的指標是否惡化。如果 Logical Reads/Tx 維持穩定,系統慢通常是併發或硬體問題;如果該值上升,則是 SQL 或索引問題。
- 監控
Shared Pool Statistics趨勢時,應特別留意% Mem for SQL w/exec > 1這個指標。如果該值變低,且Sharable Memory排名的 TOP SQL 佔比很高,就代表 Shared Pool 正在被少數幾句低效的 SQL 吞噬,這極易引發ORA-04031錯誤。
趨勢資料分析 #
指標分析項目
-
summary
- Elapsed
- DBTime
-
負載強度 (Load Profile)
- Load Profile - DB Time(s)
- Load Profile - DB CPU(s)
- Load Profile - Redo size (bytes)
- Load Profile - Logical read (blocks)
- Load Profile - Block changes
- Load Profile - Physical read (blocks)
- Load Profile - Physical write (blocks)
- Load Profile - Read IO requests
- Load Profile - Write IO requests
- Load Profile - Read IO (MB)
- Load Profile - Write IO (MB)
- Load Profile - Logons
- Load Profile - User logons
- Load Profile - Executes
- Load Profile - Rollbacks
-
執行效率 (Efficiency)
- Efficiency - Buffer Nowait %
- Efficiency - Buffer Hit %
- Efficiency - Library Hit %
- Efficiency - Execute to Parse %
- Efficiency - Parse CPU to Parse Elapsd %
- Efficiency - Flash Cache Hit %
- Efficiency - Redo NoWait %
- Efficiency - In-memory Sort %
- Efficiency - Soft Parse %
- Efficiency - Latch Hit %
- Efficiency - % Non-Parse CPU
-
記憶體配置 (Memory & Cache)
- Memory Statistics - Host Mem (MB)
- Memory Statistics - SGA use (MB)
- Memory Statistics - PGA use (MB)
- Cache Sizes - Buffer Cache
- Cache Sizes - Shared Pool Size
- Cache Sizes - In-Memory Area
- Cache Sizes - Std Block Size
- Cache Sizes - Log Buffer
-
解析質量 (Shared Pool Stats)
- Shared Pool Statistics - Memory Usage %
- Shared Pool Statistics - % SQL with executions>1
- Shared Pool Statistics - % Memory for SQL w/exec>1
-
瓶頸拆解 (Wait Class % DB Time)
- % DB time - User I/O
- % DB time - System I/O
- % DB time - Network
- % DB time - Other
- % DB time - Commit
- % DB time - Concurrency
DBTime #
|
|
執行結果範例
|
|
Load Profile 趨勢分析 - 增量(Delta) #
這段 SQL 會精準計算出每個 Snapshot 區間內的增量(Delta)
|
|
執行結果範例
|
|
指標分析說明 #
| DB Time vs DB CPU | 如果 DB Time 遠高於 DB CPU,代表資料庫大部分時間在「等待」(如 I/O, Lock),而非在「運算」。 |
| Redo Size | 反映資料庫的 DML 密集度。如果數值激增,可能是有大型 Batch Job 或索引維護。 |
| Logical vs Physical Reads | 物理讀取(Physical Reads)過高代表快取命中率(Buffer Cache Hit Ratio)不足,通常與全表掃描(Full Table Scan)有關。 |
| Executes & Logons | Logons 很高但 User Logons 不高,可能是中間層連線池(Connection Pool)配置不當,導致頻繁重連。 |
| Rollbacks | 正常的系統 Rollback 應該極低。若數值偏高,需檢查應用程式邏輯是否有大量異常導致的事務回滾。 |
Load Profile 趨勢分析 - Per Second (每秒平均) 或 Per Transaction (每個事務平均) #
核心計算公式
- Per Second: Value / Interval Duration (seconds)
- Transactions (事務數): 在 Oracle AWR 中,事務數定義為
User Commits+User Rollbacks。 - Per Transaction: Value / (Delta User Commits + Delta User Rollbacks)
|
|
執行結果範例
|
|
指標分析說明 - 如何解讀這些標準化數據? #
當您將數據轉換為這兩種維度後,分析的角度會變得完全不同:
1. Per Second (每秒平均) — 觀察「負載強度」 #
- 用途: 用來判斷系統的吞吐量上限。
- 案例: 如果
Transactions/s在某個時段維持在高點,但Executes/s突然飆升,這通常代表有大量的短小 SQL 在重複執行,可能是程式迴圈寫得不好。 - 硬體關聯:
Redo/s直接關聯到 Log Writer (LGWR) 的壓力與磁碟寫入頻寬。
2. Per Transaction (每個事務) — 觀察「工作效率」 #
- 用途: 用來判斷應用程式行為是否改變。
- 大師心法: 這是我最喜歡的指標。在正常的系統中,每個事務消耗的資源應該是穩定的。
- 異常檢測:
- 如果
Logical Reads/Tx從 1,000 變成 50,000,即便Transactions/s沒變,資料庫也會變慢。這代表索引失效或執行計畫改變,導致每個交易都要讀取更多資料塊。 - 如果
Redo/Tx突然變大,代表單個交易處理的資料量變多了(例如從更新 1 筆變成更新 100 筆)。
Efficiency Percentages 趨勢分析 #
|
|
執行結果範例
|
|
指標分析說明 #
不要只看數值高低,要看它們的穩定性
| Buffer Hit % | 通常 > 95% | 若突然下降,檢查是否有新的大表全表掃描(Full Table Scan)。 |
| Soft Parse % | 應接近 100% | 若下降,代表硬解析(Hard Parse)過多,請檢查 SQL 是否未使用 Bind Variables。 |
| Execute to Parse % | 越高越好 | 數值低代表 SQL 被解析後只執行了幾次就關閉了,這會浪費大量的 CPU。這通常與應用程式的游標(Cursor)處理邏輯有關。 |
| In-memory Sort % | 應接近 100% | 若下降,代表 PGA_AGGREGATE_TARGET 可能不足,導致排序溢出到磁碟(Temp Tablespace)。 |
| % Non-Parse CPU | 應接近 100% | 若此值過低(例如 < 80%),說明資料庫花了太多 CPU 在「解析 SQL」而不是「執行 SQL」。 |
Memory Statistics 趨勢分析 #
|
|
執行結果範例
|
|
指標分析說明 - 記憶體指標的觀察重點 #
這些數據在容量規劃與穩定性分析中至關重要:
- Host Mem (MB):
- 這是您作業系統偵測到的總實體記憶體。
- 觀察重點:此值通常是固定的。如果您的趨勢圖中這個值變小了,可能代表主機發生了硬體故障或是虛擬機動態調整了記憶體(Hot-unplug)。
- SGA use (MB):
- 包含 Buffer Cache, Shared Pool, Large Pool 等。
- 觀察重點:如果您啟用了 AMM (Automatic Memory Management) 或 ASMM (Automatic Shared Memory Management),您會看到 SGA 各組件之間的大小變動。若 SGA 總量持續接近
sga_max_size,代表資料庫已充分利用預配記憶體。
- PGA use (MB):
- 這是資料庫分配給所有 Session 進行排序、Hash Join 等運算所需的記憶體總和。
- 觀察重點:這是最容易波動的指標。如果 PGA 趨勢出現「尖峰(Spike)」,通常代表該時段有大型的 Batch Job(如大量的 Parallel Query 或大型排序)在運行。如果 PGA 持續攀升而不下降,則要警惕是否存在 Memory Leak(雖然在 Oracle 中較少見,但某些 OCI 驅動或 Bug 可能導致此現象)。
Cache Sizes 趨勢分析 #
啟用了 ASMM (Automatic Shared Memory Management),Buffer Cache 與 Shared Pool 的大小會隨負載動態調整,觀察這部分的趨勢能幫助判斷:「資料庫是否在特定的時段因為記憶體抖動(Memory Resizing)而導致效能波動?」
|
|
執行結果範例
|
|
指標分析說明 - 快取大小背後的調校重點 #
當您觀察這些數據的趨勢時,應特別留意以下現象:
- Buffer Cache 與 Shared Pool 的「拉鋸戰」:
- 如果您發現一個增加時,另一個就減少,這代表 ASMM (Automatic Shared Memory Management) 正在運作。
- 診斷心法:如果這種切換頻率過高(例如每小時都在變動),可能會觸發
library cache load lock等等待事件,甚至導致大量的 SQL Hard Parse(因為 Shared Pool 被縮小導致快取失效)。
- Log Buffer (MB):
- Log Buffer 通常在啟動後就是固定的。
- 診斷心法:如果
log_buffer在 AWR 顯示過小(通常現代系統建議在 32MB~128MB 以上),且您在負載期間看到大量的log buffer space等待,就需要考慮手動加大。
- In-Memory Area:
- 如果您的資料庫使用了 In-Memory Column Store,此處會顯示分配的大小。
- 觀察重點:確保此數值維持穩定。若發現 IM 列存空間不足,Oracle 會自動將資料回退到 Buffer Cache 讀取,這會讓查詢速度大幅下降。
- Std Block Size:
- 這是一個參考值(通常是 8192)。雖然它在單一實例中不會變動,但在計算 Load Profile(如 Physical Reads 的 Blocks 轉成 Bytes)時,它是不可或缺的基數。
Shared Pool Statistics 趨勢分析 #
在 AWR 報告中,Shared Pool Statistics 區塊是診斷 「硬解析 (Hard Parse) 壓力」 與 「SQL 重用率」 的關鍵。
這些指標能幫助識别系統是否存在「過多的一次性 SQL (One-time SQL)」,這類 SQL 會迅速消耗 Shared Pool 空間,導致正常的 SQL 被擠出 (Age out),進而引發 Library Cache 競爭。
|
|
執行結果範例
|
|
指標分析說明 - 如何根據這些數據進行調優? #
當這三個指標出現異常時,通常代表著不同的效能危機:
1. % SQL with executions > 1 (SQL 重用率) #
- 理想狀態:應保持在 80% - 95% 以上。
- 警訊:如果這個值很低(例如 < 50%),代表系統中充斥著大量未綁定變數 (Literal SQL)。
- 影響:這會導致極高的 CPU 消耗在硬解析上,並可能引發
latch: shared pool或library cache pin等待。
2. % Memory for SQL w/exec > 1 (重用 SQL 的記憶體佔比) #
- 理想狀態:此值應盡可能接近 100%。
- 診斷心法:如果此值顯著低於 90%,代表 Shared Pool 的大部分記憶體都被那些「只執行一次就再也不用」的 SQL 給佔據了。這就是所謂的 Shared Pool 碎片化。
- 對策:考慮將初始化參數
CURSOR_SHARING暫時改為FORCE(需謹慎評估執行計畫風險),或者推動開發團隊修改程式碼使用綁定變數。
3. Memory Usage % (Shared Pool 使用率) #
- 觀察重點:在生產環境中,這個值通常會穩定在 90% - 95%。
- 關鍵細節:如果使用率一直維持在 99% 以上且
Free Memory極低,加上重用率低,這就是觸發ORA-04031錯誤的前兆。
Total_SQL_Mem_MB, avg_SQL_Mem_MB #
- 階梯式上升 (The Staircase):
- 現象:記憶體佔用在某個時間點上升後就不再下降,呈現階梯狀。
- 含義:這代表有新的 SQL 進入了 Shared Pool 但沒有被釋放(可能是因為
Version Count攀升或是不斷有新的 Literal SQL 產生)。
- 與「SQL 重用率」的反向關聯:
- 聯動分析:請將這條線與你之前的
% SQL with executions > 1趨勢圖放在一起看。 - 大師心法:如果「總記憶體消耗」上升,而「重用率」下降,這 100% 是因為應用程式正在大量使用未綁定變數的 SQL,正在污染 Shared Pool。
- 峰值 (Max) 與平均值 (Avg) 的間距:
- 含義:如果
Max遠大於Avg,說明該小時內有「瞬時巨獸」出現(例如一次性的大型 IN 清單查詢),這會導致 Shared Pool 瞬間碎片化。
% DB Time by Wait Class 趨勢分析 #
將 DB Time 拆解為各個 Wait Class (等待類別) 的佔比,是判斷資料庫「瓶頸性質」的最快路徑。
|
|
執行結果範例
|
|
指標分析說明 #
- % User I/O 高 (例如 > 40%):
- 現象:資料庫花大量時間在等待從磁碟讀取資料。
- 原因:通常是 SQL 缺少索引導致全表掃描(Full Table Scan),或是
Buffer Cache太小。
- % Commit 高 (通常是
log file sync):
- 現象:每個事務(Transaction)提交時太慢。
- 原因:磁碟寫入 Redo Log 的速度跟不上,或者是應用程式採取了過於頻繁的提交(例如在迴圈內 Commit)。
- % Concurrency 高:
- 現象:Session 之間在互相排隊。
- 原因:常見於鎖競爭(TX - row lock contention)或熱點塊(Latch / Buffer Busy Waits)。這通常需要優化應用程式邏輯。
- % System I/O 高:
- 原因:通常與後端進程(如 DBWR 或 LGWR)的寫入壓力有關,或是正在執行備份、資料庫檢查點(Checkpoint)。
- % DB CPU 高 (補充指標):
- 現象:這是好事,說明資料庫主要在「做事」而非「等待」。
- 例外:如果 CPU 100% 且系統很慢,則代表有 SQL 正在進行大量的邏輯讀(Logical Reads)或運算複雜度過高。