首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 效能調優核心指標體系:12 大命中率計算、等待事件分析與 SQL 優化實戰方法論

     編輯:Oracle 資料庫基礎

命中率指標體系:計算公式、健康閾值與調優動作

#指標計算 SQL / 公式健康閾值調優方向
1Library Cache Hit Ratio`SELECT SUM(pinhits)/SUM(pins) FROM V$LIBRARYCACHE;`> 98%增大 SHARED_POOL_SIZE、使用繫結變數、調整 CURSOR_SHARING
2Shared Pool 記憶體使用率`SELECT (1-ROUND(bytes/(&TSP_IN_M*1024*1024),2))*100 FROM V$SGASTAT WHERE NAME='free memory' AND POOL='shared pool';`75%-90%過小增大、過大縮減避免換頁
3Buffer Cache Hit Ratio`SELECT 1-(physical_reads/(db_block_gets+consistent_gets)) FROM V$BUFFER_POOL_STATISTICS WHERE NAME='DEFAULT';`> 90%增大 DB_CACHE_SIZE、優化高耗 SQL、KEEP/RECYCLE 池隔離
4Buffer Cache Hit Ratio (官方精確版)`1-((phys_reads-phys_reads_direct-phys_reads_direct_lob)/(db_block_gets+cons_gets-phys_reads_direct-phys_reads_direct_lob))`> 90%排除直接讀/LOB 干擾,更精準
5Shared Pool Hit Ratio (另算法)`SELECT SUM(pinhits-reloads)/SUM(pins)*100 FROM V$LIBRARYCACHE;`> 95%關注 RELOADS,調整應用或記憶體
6記憶體排序比率`ROUND(sorts_mem/(sorts_mem+sorts_disk),4)*100%`> 95%增大 PGA_AGGREGATE_TARGET、優化排序 SQL
7PGA Cache Hit %`SELECT * FROM V$PGASTAT WHERE NAME='cache hit percentage';` 或 OEM 圖形> 50%(建議 > 70%)參考 V$PGA_TARGET_ADVICE 設定 PGA 目標
8Dictionary Cache Hit Ratio`SELECT SUM(gets-getmisses-usage-fixed)/SUM(gets) FROM V$ROWCACHE;`> 85%通常隨 Library Cache 優化同步提升
9Buffer Cache Hit Ratio (Sysstat 版)`SELECT 1-(physical_reads/(db_block_gets+consistent_gets)) FROM V$SYSSTAT...`> 90%同指標 3,不同視圖來源
10Library Cache Hit Ratio (Pins-Reloads)`SELECT SUM(pins-reloads)/SUM(pins) FROM V$LIBRARYCACHE;`> 99%極高要求,關注 RELOADS 絕對值
11Rollback Segment 爭用率`SELECT SUM(waits)/SUM(gets) FROM V$ROLLSTAT;`< 1%增加 Undo Segment、調大 Undo 表空間、優化長事務
12Rollback Segment 收縮次數`SELECT name, shrinks FROM V$ROLLSTAT, V$ROLLNAME WHERE usn=usn;`極少頻繁收縮→調大 Undo、設定 MINEXTENTS

六大 Buffer Cache 低命中率診斷步驟

  1. 確認命中率: `SELECT ROUND((1-(phy_reads/(db_blk_gets+con_gets)))*100,2) FROM V$SYSSTAT;` < 90% 才算低。
  2. 檢查 Free Buffer: `SELECT COUNT(*), status FROM V$BH GROUP BY status;` 無 FREE 不一定要加記憶體,結合當前大小判斷。
  3. 等待事件分析: `SELECT event, total_waits FROM V$SYSTEM_EVENT WHERE EVENT='free buffer waits';` 有等待 → DBWn 寫入跟不上或緩衝區過小/過大。
  4. 當前大小: `SELECT value/1024/1024 FROM V$PARAMETER WHERE NAME='db_cache_size';` 評估是否已達硬體上限。
  5. Top 等待事件: `db file scattered read` 佔比高 → **大量全表掃描**,優化 SQL/建索引優於加記憶體。
  6. 參考建議: `SELECT * FROM V$DB_CACHE_ADVICE;` 9i+ 新特性,模擬不同大小下的實體讀預估。
💡 實戰心得: 200M Cache 命中率 21% → **優化 SQL(加索引消除全表掃描) → 命中率 96%,執行時間 2小時 → 10分鐘**。**SQL 優化才是本質,記憶體只是緩衝劑。**

高耗 SQL 定位三板斧

  1. SQL Trace + TKPROF: `ALTER SESSION SET SQL_TRACE=TRUE;` → 執行 → `tkprof` 分析磁碟讀/邏輯讀/耗時 Top SQL。
  2. Statspack/AWR: 繁忙時段快照 → Top 事件含 `db file scattered read` → Top SQL 分析執行計畫、索引缺失、統計過期。
  3. V$SQLAREA 即時查詢:
    • 排序最多:`SELECT * FROM V$SQLAREA ORDER BY SORTS DESC;`
    • 磁碟讀最多:`SELECT * FROM (SELECT sql_text, disk_reads/executions FROM V$SQL WHERE executions>0 ORDER BY 2 DESC) WHERE ROWNUM<11;`
    • 低效 SQL(命中率低):`SELECT * FROM V$SQLAREA WHERE executions>0 AND buffer_gets>0 AND (buffer_gets-disk_reads)/buffer_gets<0.8 ORDER BY 4;`

硬體與參數調整的邊界認知

  • 硬體允許下**適度增大 DB_CACHE_SIZE** 減少實體讀,**但非越大越好**(管理開銷、檢查點耗時、換頁風險)。
  • **物盡其用、精準定位瓶頸**才是藝術:Buffer Cache 低 → 先看 Top SQL 有無全表掃描 → 有則優化 SQL/加索引 → 無則評估加記憶體/KEEP 池隔離熱表。
  • 索引是在**不修改程式碼**情況下提升效能**最實用**手段。

常用診斷 SQL 快速參考卡

-- 當前會話正在執行的 SQL (需 SID)
SELECT * FROM V$SQLAREA WHERE ADDRESS=(SELECT SQL_ADDRESS FROM V$SESSION WHERE SID=&SID);

-- 緩衝區命中率快速查
SELECT ROUND((1-(phy/(db_blk+con)))*100,2)||'%' FROM 
(SELECT VALUE phy FROM V$SYSSTAT WHERE NAME='physical reads'),
(SELECT VALUE db_blk FROM V$SYSSTAT WHERE NAME='db block gets'),
(SELECT VALUE con FROM V$SYSSTAT WHERE NAME='consistent gets');

-- 共享池命中率快速查
SELECT SUM(pinhits)/SUM(pins)*100||'%' FROM V$LIBRARYCACHE;

-- 排序記憶體/磁碟比
SELECT name, value FROM V$SYSSTAT WHERE NAME LIKE '%sort%';
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved