資料庫效能調優的核心在於找出「壞 SQL」(Bad SQL)——那些消耗大量資源、導致回應緩慢的語句。本文介紹在 Oracle 環境下,透過動態效能視圖 V$SQLAREA 快速定位高耗損 SQL 的實用查詢,並說明執行時機與注意事項。
邏輯讀過高通常代表全表掃描、索引失效或連接順序不佳。
SELECT * FROM (
SELECT buffer_gets, sql_text
FROM v$sqlarea
WHERE buffer_gets > 500000
ORDER BY buffer_gets DESC
) WHERE rownum <= 30;
高頻執行的 SQL 雖單次耗資源少,但累積影響巨大,優化 ROI 最高。
SELECT sql_text, executions
FROM (
SELECT sql_text, executions
FROM v$sqlarea
ORDER BY executions DESC
) WHERE rownum < 81;
實體讀直接對應磁碟 I/O,是效能殺手首選排查目標。
SELECT sql_text, disk_reads
FROM (
SELECT sql_text, disk_reads
FROM v$sqlarea
ORDER BY disk_reads DESC
) WHERE rownum < 21;
| 指標 | 含義 | 優化方向 |
|---|---|---|
| ELAPSED_TIME / EXECUTIONS | 平均執行時間 | 優化執行計畫、加索引、改寫 SQL |
| CPU_TIME / EXECUTIONS | 平均 CPU 耗用 | 減少運算、避免隱含轉換 |
| ROWS_PROCESSED / EXECUTIONS | 平均回傳列數 | 檢查是否撈取過多資料、分頁處理 |
| SHARABLE_MEM | 佔用共享池記憶體 | 使用綁定變數、減少硬解析 |
V$SQLAREA 為即時快照,歷史趨勢請參考 AWR 報表的「SQL ordered by Elapsed Time/Buffer Gets/Disk Reads/Executions」章節。SQL_ID 後,使用 DBMS_XPLAN.DISPLAY_CURSOR('sql_id', NULL, 'ALL') 取得實際執行計畫,分析存取路徑、基數估算偏差。V$SQLAREA 中同一 SQL 可能有多個子游標(CHILD_NUMBER),需針對特定子游標分析。找出 Bad SQL 只是第一步,關鍵在於「讀懂執行計畫、理解資料分佈、精準改寫或建立適當索引」。持續建立 SQL 效能基線、定期複盤,才能讓資料庫長期穩定高效運行。