從 V$SQLAREA 找出邏輯讀 (Buffer Gets) 與物理讀 最高的 SQL,是效能調優的第一步。本文提供標準 Top 10 查詢腳本。
SET LINESIZE 300 PAGESIZE 300
SET LONG 50000
SELECT *
FROM (
SELECT sql_fulltext AS sql,
sql_id,
buffer_gets / executions AS "Gets/Exec",
buffer_gets,
executions
FROM v$sqlarea
WHERE buffer_gets > 10000
AND executions > 0
ORDER BY "Gets/Exec" DESC
)
WHERE ROWNUM <= 10;
SET LINESIZE 300 PAGESIZE 300
SET LONG 50000
SELECT *
FROM (
SELECT sql_fulltext AS sql,
sql_id,
disk_reads / executions AS "Reads/Exec",
disk_reads,
executions
FROM v$sqlarea
WHERE disk_reads > 1000
AND executions > 0
ORDER BY "Reads/Exec" DESC
)
WHERE ROWNUM <= 10;
| 指標 | 含義 | 調優方向 |
|---|---|---|
| BUFFER_GETS | 邏輯讀總量 (記憶體存取) | 優化索引、減少全表掃描、改寫 SQL |
| DISK_READS | 物理讀總量 (磁碟 I/O) | 增加快取、調整索引、分區裁剪 |
| EXECUTIONS | 執行次數 | 高執行次數配合高 Gets/Exec = 關鍵目標 |
| GETS/EXEC | 單次執行平均邏輯讀 | 核心效能指標,越低越好 |
| READS/EXEC | 單次執行平均物理讀 | 核心 I/O 指標,越低越好 |
SELECT t.sid, n.name, t.value FROM v$sesstat t, v$statname n WHERE t.statistic# = n.statistic# AND n.statistic# IN (9, 54) -- 9: session logical reads, 54: physical reads AND t.sid = &sid;
SELECT * FROM v$resource_limit
WHERE resource_name IN ('processes','sessions','enqueue_locks','dml_locks','transactions');
SELECT * FROM v$sql_plan WHERE sql_id = '...' 看執行計畫V$SQLAREA 為共享游標統計,隨 Shared Pool 洗出而重置DBMS_WORKLOAD_REPOSITORY)buffer_gets > 10000、disk_reads > 1000 視系統規模調整executions = 0 避免除零錯誤