SQL 調優始於發現問題語句。本文建構系統性識別流程:從使用者回報、V$SQLAREA 統計分析、Session 即時監控到 SQL Trace 深度診斷,提供 DBA 完整工具鏈。
收集具體症狀:特定功能回應緩慢、批次作業超時、特定時段效能下降。記錄:時間點、執行參數、預期與實際耗時。
V$SQLAREA 記錄共用池中游標的累積執行統計,是發現高消耗 SQL 的首選切入點。
| 欄位 | 含義 | 調優意義 |
|---|---|---|
| EXECUTIONS | 執行次數 | 高頻 SQL 需優先優化 |
| DISK_READS | 物理讀取次數 | 大量物理讀暗示索引缺失或統計過期 |
| BUFFER_GETS | 邏輯讀取次數 | 高邏輯讀代表掃描量大,需檢查執行計畫 |
| COMMAND_TYPE | 命令類型 | 3=SELECT, 2=INSERT, 6=UPDATE, 7=DELETE, 47=PL/SQL |
| OPTIMIZER_MODE | 優化器模式 | ALL_ROWS/FIRST_ROWS 影響執行計畫選擇 |
| SQL_TEXT | SQL 文本 | 前 1000 字元,完整文本查 V$SQL_FULLTEXT |
| SHARABLE_MEM | 共用池佔用記憶體 | 大型游標可能導致共用池碎片 |
-- Top 10 邏輯讀 SQL
SELECT * FROM (
SELECT sql_id, executions, buffer_gets, disk_reads,
buffer_gets/executions "Gets/Exec",
sql_text
FROM v$sqlarea
WHERE executions > 0
ORDER BY buffer_gets DESC
) WHERE rownum <= 10;
-- Top 10 物理讀 SQL
SELECT * FROM (
SELECT sql_id, executions, disk_reads,
disk_reads/executions "Reads/Exec",
sql_text
FROM v$sqlarea
WHERE executions > 0
ORDER BY disk_reads DESC
) WHERE rownum <= 10;
-- 高頻執行 SQL(可能為熱點語句)
SELECT * FROM (
SELECT sql_id, executions, sql_text
FROM v$sqlarea
ORDER BY executions DESC
) WHERE rownum <= 10;
Enterprise Manager / SQL Developer / 自訂查詢 V$SESSION、V$SESSION_WAIT、V$SQL_MONITOR(11g+)。
時鐘圖示:長時間運行 SQL 的視覺指標,需立即介入分析。
db file sequential read:索引讀取,檢查索引選擇性db file scattered read:全表掃描,評估是否需索引log file sync:Commit 等待,檢查重做日誌 I/Olatch: cache buffers chains:熱塊競爭,考慮分區/反向索引-- 1. 確認參數
SHOW PARAMETER timed_statistics;
SHOW PARAMETER user_dump_dest;
SHOW PARAMETER max_dump_file_size;
-- 2. Session 級啟用
ALTER SESSION SET SQL_TRACE = TRUE;
-- 或 DBMS_MONITOR.SESSION_TRACE_ENABLE
-- 3. 執行目標 SQL
-- 4. 關閉追蹤
ALTER SESSION SET SQL_TRACE = FALSE;
-- 5. 使用 TKPROF 格式化
TKPROF tracefile.trc output.txt EXPLAIN=user/pass SYS=NO SORT=PRSDS,EXEDS,FCHDS
| 指標 | 高值含義 | 對策方向 |
|---|---|---|
| PARSE | 硬解析過多 | 增加共用池、使用繫結變數、CURSOR_SHARING |
| QUERY / CURRENT | 邏輯讀過大 | 檢查索引、重寫 SQL、分區裁剪 |
| DISK | 物理讀過大 | 索引優化、增加緩衝區快取、SSD 儲存 |
| LIBRARY CACHE MISS | 共用池不足 | 增加 SHARED_POOL_SIZE、固定熱點游標 |