「線上 SQL 什麼時候跑的?跑多久?誰跑的?執行計劃變了嗎?」本文提供**實時會話 SQL、歷史執行記錄、高消耗 Top SQL、等待事件關聯**四大維度查詢腳本,直擊生產性能現場。
SELECT s.username,
s.sid,
s.serial#,
s.status,
s.machine,
s.program,
s.module,
s.sql_id,
sq.sql_text,
sq.sql_fulltext
FROM v$session s
JOIN v$sql sq ON s.sql_id = sq.sql_id AND s.sql_child_number = sq.child_number
WHERE s.status = 'ACTIVE'
AND s.type != 'BACKGROUND'
AND s.username IS NOT NULL
ORDER BY s.last_call_et DESC;
SQL_ID + CHILD_NUMBER 唯一標識游標,關聯 V$SQL_PLAN 獲取實時執行計劃。LAST_CALL_ET:當前操作已耗秒數,> 60 秒關注長跑 SQL。SELECT sql_id,
sql_text,
first_load_time,
last_load_time,
executions,
elapsed_time/1e6 AS elapsed_sec,
cpu_time/1e6 AS cpu_sec,
buffer_gets,
disk_reads,
rows_processed
FROM v$sqlarea
WHERE first_load_time BETWEEN TO_DATE('2024-01-15 09:00','YYYY-MM-DD HH24:MI')
AND TO_DATE('2024-01-15 10:00','YYYY-MM-DD HH24:MI')
ORDER BY elapsed_time DESC;
FIRST_LOAD_TIME 精度到秒,適合事後追溯某時間窗口的 SQL。SQL_FULLTEXT 包含完整 SQL 文本(CLOB),長文本需 DBMS_LOB.SUBSTR 截取。SELECT s.osuser,
s.program,
s.username,
s.schemaname,
s.status,
sq.cpu_time/1e6 AS cpu_sec,
sq.elapsed_time/1e6 AS ela_sec,
sq.buffer_gets,
sq.disk_reads,
sq.sql_text
FROM v$session s
LEFT JOIN v$sql sq ON s.sql_id = sq.sql_id AND s.sql_child_number = sq.child_number
WHERE s.type != 'BACKGROUND'
ORDER BY sq.cpu_time DESC NULLS LAST;
SELECT sql_id, piece, sql_text
FROM v$sqltext
WHERE sql_id = 'abcdef1234567890'
ORDER BY piece;
SELECT *
FROM (
SELECT parsing_user_id,
executions,
sorts,
command_type,
disk_reads,
buffer_gets,
sql_text
FROM v$sqlarea
ORDER BY disk_reads DESC
)
WHERE ROWNUM <= 10;
SELECT se.sid,
se.serial#,
p.spid AS os_pid,
se.username,
se.status,
se.machine,
se.program,
se.module,
sw.event,
sw.p1text, sw.p1,
si.physical_reads,
si.block_changes
FROM v$session se
JOIN v$session_wait sw ON se.sid = sw.sid
JOIN v$sess_io si ON se.sid = si.sid
JOIN v$process p ON se.paddr = p.addr
WHERE se.sid > 6
AND sw.wait_time = 0
AND sw.event NOT LIKE '%SQL*Net%'
AND sw.event NOT LIKE '%rdbms ipc%'
ORDER BY si.physical_reads DESC;
db file scattered read、direct path read、log file sync 等實質 I/O 事件。PHYSICAL_READS 累計物理讀塊數,BLOCK_CHANGES 修改塊數,識別「讀多寫少」或「寫多讀少」會話。| 維度 | 查詢源 | 刷新頻率 | 告警閾值 |
|---|---|---|---|
| 活躍會話數 | V$SESSION | 10 秒 | > 500 |
| 長跑 SQL (>60s) | V$SESSION + V$SQL | 30 秒 | 存在即告警 |
| Top 10 CPU SQL | V$SQLAREA | 1 分鐘 | 單條 CPU > 30% 總 CPU |
| Top 10 物理讀 SQL | V$SQLAREA | 1 分鐘 | 單條物理讀 > 10% 總物理讀 |
| 高 I/O 等待會話 | V$SESSION_WAIT + V$SESS_IO | 30 秒 | > 20 會話等待 db file scattered read |