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

Oracle 10g 效能調優實戰經驗:從 OS 層到 SQL 層的系統化調優方法論

     編輯:Oracle 資料庫基礎

調優心法:由外而內、由大到小

面對「資料庫慢」,資深 DBA 不會只盯著 SQL。完整調優鏈路:網路 → 硬體 → OS → Oracle 參數 → 資料結構 → 單支 SQL。前三層往往難以變更,故Oracle 參數調校與資料結構優化是最高投報比切入點。本文針對 Unix/Linux 環境,分享系統化調優實戰經驗。

第一層:OS 層資源檢查與瓶頸識別

1.1 CPU 與 I/O 等待分析

# sar -u 2 10  (每 2 秒採樣 1 次,共 10 次)
Linux 2.4.21-20.ELsmp (YY075) 05/19/2005
10:36:07 AM CPU %user %nice %system %iowait %steal %idle
10:36:09 AM all 0.00 0.00 0.13 0.00 0.00 99.87
10:36:11 AM all 0.00 0.00 0.00 0.00 0.00 100.00
...
  • %iowait (或 %system 在某些版本):CPU 等待 I/O 完成的時間比例。**> 35% 表示 I/O 瓶頸**
  • %idle 接近 0:CPU 飽和,需檢查高佔用進程
  • 示例中 %iowait 平均 11% (可接受),但 %idle 為 0 → CPU 瓶頸

I/O 瓶頸三大解決方向

  1. OS/儲存層優化:條帶化、多路徑、快取策略、SSD 階層
  2. SQL 層減少無效 I/O:優化全表掃描、建立適當索引、分區裁剪
  3. 資料庫層隔離熱點:熱表/索引放入獨立表空間、不同磁碟群組、ASM 磁碟群

1.2 記憶體壓力檢查

# vmstat 2 10
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 1  0      0 123456  12345 123456    0    0     1     2   10   20  1  0 99  0
  • si/so (swap in/out) 非零:記憶體不足發生換頁,效能暴跌
  • free 極小、cache 極大:OS 記憶體壓力大
  • Glance/Topas/Nmon 等進階工具可視化顯示進程級記憶體佔用

記憶體調優四原則

  1. SGA ≤ 實體記憶體 40-50% (預留 OS、PGA、其他進程)
  2. 增加實體記憶體 (最直接有效)
  3. 連接數極多時啟用 MTS (Shared Server) 減少 PGA 總量
  4. 套用最新 PSU/RU 修復記憶體洩漏

1.3 定位高資源消耗 Session

# Glance / Top / Topas / ps -eo pid,pcpu,pmem,cmd --sort=-pcpu | head
# 找到高 CPU/記憶體的 Oracle 進程 PID (SPID)

對應到資料庫 Session 與 SQL:

SELECT a.username, a.machine, a.program, a.sid, a.serial#, a.status,
       c.piece, c.sql_text
FROM v$session a, v$process b, v$sqltext c
WHERE b.spid = 
  AND b.addr = a.paddr
  AND a.sql_address = c.address(+)
ORDER BY c.piece;

第二層:SQL 層優化核心技巧

2.1 經典改寫:IN → EXISTS

-- ❌ 慢:IN 內部轉 OR,即使有索引也慢
SELECT col1, col2, col3 FROM table1 a
WHERE a.col1 NOT IN (SELECT col1 FROM table2);

-- ✅ 快:NOT EXISTS 可使用反連結、半連結優化
SELECT col1, col2, col3 FROM table1 a
WHERE NOT EXISTS (
    SELECT 1 FROM table2 b WHERE a.col1 = b.col1
);

2.2 統計資訊收集:CBO 的生命線

-- 10g+ 建議 DBMS_STATS (支援並行、直方圖、增量統計)
EXEC DBMS_STATS.GATHER_TABLE_STATS(
    ownname => 'SCHEMA',
    tabname => 'BIG_TABLE',
    estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,
    method_opt => 'FOR ALL COLUMNS SIZE AUTO',
    cascade => TRUE,
    degree => 4
);

-- 檢查最後分析時間
SELECT table_name, last_analyzed FROM dba_tables WHERE owner = 'SCHEMA';
SELECT index_name, last_analyzed FROM dba_indexes WHERE table_owner = 'SCHEMA';
  • 無統計資訊 → CBO 退化為 RBO → 全表掃描
  • 大表抽樣百分比勿太低 (建議 AUTO_SAMPLE_SIZE)
  • 斜態欄位 (如狀態碼、性別) 必須收集直方圖

2.3 Top 10 高耗 SQL 快速掃描

SELECT * FROM (
    SELECT parsing_user_id, executions, sorts, command_type, 
           disk_reads, sql_text
    FROM v$sqlarea
    ORDER BY disk_reads DESC
) WHERE ROWNUM <= 10;

第三層:等待事件分析——精準定位瓶頸

查詢 V$SESSION_WAIT 找出系統在等什麼:

SELECT se.sid, se.serial#, pr.spid, se.username, se.status, se.terminal,
       se.program, se.module, se.sql_address,
       st.event, st.p1text, si.physical_reads, si.block_changes
FROM v$session se, v$session_wait st, v$sess_io si, v$process pr
WHERE st.sid = se.sid AND si.sid = se.sid AND se.paddr = pr.addr
  AND se.sid > 6 AND st.wait_time = 0 AND st.event NOT LIKE '%SQL%'
ORDER BY si.physical_reads DESC;

核心等待事件解讀與對策

DBWR 不足的具體參數調整

-- init.ora / spfile
DB_WRITER_PROCESSES = 4
DB_BLOCK_LRU_LATCHES = 8  -- 必須 ≥ 2 * DB_WRITER_PROCESSES
  • V$SESSION_WAIT 中 free buffer wait 條目多 → DBWR 確定不夠
  • 啟用非同步 I/O:AIX 簡單、HP-UX 需廠商支援、Linux 核心 2.6+ 原生支援

實戰調優檢查清單

  1. OS 層:sar -u 看 %iowait、vmstat 看 si/so、top/glance 找高佔用進程
  2. 對應 Session:SPID → V$SESSION → SQL_TEXT → EXPLAIN PLAN
  3. SQL 優化:IN→EXISTS、綁定變數、WHERE 順序、避免索引欄位函數、統計資訊更新
  4. 等待事件:V$SESSION_WAIT 看 event、p1/p2/p3 參數、physical_reads 排序
  5. 參數調整:DBWR、非同步 I/O、DB_FILE_MULTIBLOCK_READ_COUNT、Shared Pool
  6. 驗證:調整前後 SET TIMING ON、AUTOTRACE、STATSPACK/AWR 對比

總結

Oracle 10g 調優已轉型為優化等待。核心流程:OS 看資源 → 等待事件看瓶頸類型 → SQL 看執行計劃 → 參數/結構對症下藥。三板斧 (SGA、統計資訊、等待事件) 解決 80% 問題。剩餘 20% 需架構層面:分區、MV、快取、應用重構、硬體升級。調優無終點,只有持續的觀測、假設、驗證、迭代。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
等待事件含義對策
buffer busy waits / free buffer waitsDBWR 寫入跟不上、緩衝區爭用增加 DB_WRITER_PROCESSES (如 4)、同步增大 DB_BLOCK_LRU_LATCHES (如 8)、啟用非同步 I/O
db file sequential read單塊讀 (索引存取、單塊表存取)優化 SQL 走索引、分區裁剪、增大 DB_FILE_MULTIBLOCK_READ_COUNT
db file scattered read多塊讀 (全表掃描、快速全索引掃描)建索引、分區、MV、增大 DB_FILE_MULTIBLOCK_READ_COUNT
latch free共用池/緩衝區 Latch 爭用增大 Shared Pool、使用綁定變數、Cursor Sharing、減少硬解析
log file syncCommit 等待 LGWR 寫入 RedoRedo Log 放快速儲存、批次 Commit、檢查 LGWR 效能
enq: TX - row lock contention行鎖競爭縮短交易、外鍵加索引、邏輯拆分熱點列