定期(如每月)在離峰時段執行分析查詢,避免增加生產負載。根據實際系統特徵調整閾值,切勿生搬硬套。
SELECT * FROM (
SELECT buffer_gets, sql_text
FROM v$sqlarea
WHERE buffer_gets > 500000
ORDER BY buffer_gets DESC
) WHERE rownum <= 30;
SELECT sql_text, executions FROM (
SELECT sql_text, executions
FROM v$sqlarea
ORDER BY executions DESC
) WHERE rownum < 81;
SELECT sql_text, disk_reads FROM (
SELECT sql_text, disk_reads
FROM v$sqlarea
ORDER BY disk_reads DESC
) WHERE rownum < 21;
SELECT sql_text, sorts FROM (
SELECT sql_text, sorts
FROM v$sqlarea
ORDER BY sorts DESC
) WHERE rownum < 21;
解析次數多但執行次數少,建議改用綁定變數:
SET PAGESIZE 600 LINESIZE 120
SELECT SUBSTR(sql_text,1,80) "SQL", COUNT(*), SUM(executions) "TotExecs"
FROM v$sqlarea
WHERE executions < 5
GROUP BY SUBSTR(sql_text,1,80)
HAVING COUNT(*) > 30
ORDER BY 2;
-- 目前開啟游標總數
SELECT SUM(a.value), b.name
FROM v$sesstat a, v$statname b
WHERE a.statistic# = b.statistic#
AND b.name = 'opened cursors current'
GROUP BY b.name;
-- 依用戶與 SQL 統計開啟游標數
SELECT user_name, sql_text, COUNT(0)
FROM v$open_cursor
GROUP BY user_name, sql_text
HAVING COUNT(0) > 30;
SELECT sql_text
FROM v$sqltext_with_newlines
WHERE (hash_value, address) IN (
SELECT sql_hash_value, sql_address
FROM v$session
WHERE username = '&username'
)
ORDER BY address, piece;
EXPLAIN PLAN 分析執行計畫。