當資料庫 CPU 飆高時,快速定位高消耗 SQL 與會話是解決問題的關鍵。本文彙總從系統級解析到會話級鑽取的完整查詢集,幫助 DBA 在幾分鐘內鎖定性能瓶頸。
-- 1. 找出硬解析最多的 SQL(parse_calls 高通常意味著未使用綁定變數) select sql_text, parse_calls, executions from v$sqlarea order by parse_calls desc; -- 2. 檢視實例級解析統計 select name, value from v$sysstat where name like 'parse count%'; -- 3. 作業系統級 CPU 佔用與負載 select * from v$osstat;
-- 4. 列出所有會話的 CPU 使用時間(微秒),按降序排列 select ss.sid, se.command, ss.value CPU, se.username, se.program from v$sesstat ss, v$session se where ss.statistic# in (select statistic# from v$statname where name = 'CPU used by this session') and se.sid = ss.sid and ss.sid > 6 order by CPU desc;
-- 5. 指定 SID 查看其等待事件與 SQL 全文
select s.sid, s.event, s.machine, s.osuser, s.wait_time,
w.seq#, q.sql_text
from v$session_wait w, v$session s, v$process p, v$sqlarea q
where s.paddr = p.addr
and s.sid = &p
and s.sql_address = q.address;
-- 6. 綜合視圖:CPU 前 10 會話的等待狀態、進程資訊與 SQL 文本
select s.sid, w.wait_time, w.seconds_in_wait, w.state, w.wait_time_micro,
p.username, s.status, s.server, s.schemaname, s.osuser, s.machine,
p.terminal, p.program, s.logon_time, w.event, w.wait_class,
s.tracefile, q.sql_text, q.last_active_time
from v$session_wait w, v$session s, v$process p, v$sqlarea q
where s.paddr = p.addr
and s.sid in (
select sid from (
select ss.sid
from v$sesstat ss, v$session se
where ss.statistic# in (select statistic# from v$statname where name = 'CPU used by this session')
and se.sid = ss.sid
and ss.sid > 6
order by ss.value desc
) where rownum < 11
)
and s.sql_address = q.address;
latch: cache buffers chains 或 library cache,結合查詢 1 分析硬解析或熱塊競爭;