AWR 報告中 SQL Ordered by Gets (邏輯讀/Buffer Gets) 反映 CPU 壓力來源;SQL Ordered by Reads (物理讀/Physical Reads) 反映 I/O 壓力來源。兩大榜單是效能調優的「聚光燈」。
SQL Ordered by Gets
Total Buffer Gets: ###############
Captured SQL account for 5.0% of Total
Buffer Gets Executions Gets/Exec %Total CPU Time(s) Elapsed Time(s) SQL Id Module SQL Text
1,606,380,390 84 19,123,576 -0.84 37,923.62 207,407.54 78tpfukr4m00p JDBC Thin Client SELECT SUM(temp.MidUser) ...
1,479,957,445 0 - -0.77 26,647.48 43,778.62 2mxgaus0t6pxz JDBC Thin Client SELECT 設備ID ...
1,280,365,092 73 17,539,247 -0.67 30,263.02 159,789.71 2qrj96dwj2xx1 JDBC Thin Client SELECT SUM(temp.MidUser) ...
...
分析:前幾條 SQL 佔據絕大多數 Buffer Gets,Gets/Exec 極高 (千萬級),CPU Time 接近 Elapsed Time,顯示純 CPU 運算瓶頸 (無 I/O 等待)。
對策:
OPTIMIZER_MODE、統計資訊收集頻率。Top 5 等待事件中 direct path read 佔比極高。Oracle 11g 引入 _SMALL_TABLE_THRESHOLD (預設 2% * DB_CACHE_SIZE) 判定大表是否走 Direct Path Read 繞過 Buffer Cache。
對策:
_SMALL_TABLE_THRESHOLD (隱藏參數,需諮詢 Oracle Support) 或升級至 12c+ 使用 DB_BIG_TABLE_CACHE_PERCENT_TARGET 自動管理大表快取。
-- 即時查詢高消耗 SQL (需診斷包授權)
SELECT sql_id, executions, buffer_gets, disk_reads,
buffer_gets/executions AS gets_per_exec,
cpu_time/1e6 AS cpu_sec, elapsed_time/1e6 AS ela_sec
FROM v$sqlstats
WHERE executions > 0
ORDER BY buffer_gets DESC
FETCH FIRST 20 ROWS ONLY;
-- 對應物理讀
ORDER BY disk_reads DESC;
定期審閱 AWR Gets/Reads 榜單,是資料庫預防性維護的核心動作。