首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

如何找出系統中效能不佳的 SQL 語句?Oracle Bad SQL 排查實戰

     編輯:關於SqlServer

前言

資料庫效能調優的核心在於找出「壞 SQL」(Bad SQL)——那些消耗大量資源、導致回應緩慢的語句。本文介紹在 Oracle 環境下,透過動態效能視圖 V$SQLAREA 快速定位高耗損 SQL 的實用查詢,並說明執行時機與注意事項。

核心查詢語句

1. 邏輯讀最高的 Top 30 SQL(Buffer Gets)

邏輯讀過高通常代表全表掃描、索引失效或連接順序不佳。

SELECT * FROM (
    SELECT buffer_gets, sql_text
    FROM v$sqlarea
    WHERE buffer_gets > 500000
    ORDER BY buffer_gets DESC
) WHERE rownum <= 30;

2. 執行次數最多的 Top 80 SQL

高頻執行的 SQL 雖單次耗資源少,但累積影響巨大,優化 ROI 最高。

SELECT sql_text, executions
FROM (
    SELECT sql_text, executions
    FROM v$sqlarea
    ORDER BY executions DESC
) WHERE rownum < 81;

3. 實體讀最高的 Top 20 SQL(Disk Reads)

實體讀直接對應磁碟 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佔用共享池記憶體使用綁定變數、減少硬解析

實務建議

  1. 排查時機:建議在系統穩定運行一段時間後,於離峰時段(如半夜)定期(每月)執行,避免增加業務高峰期負載。
  2. 結合 AWR/ASH 報表:V$SQLAREA 為即時快照,歷史趨勢請參考 AWR 報表的「SQL ordered by Elapsed Time/Buffer Gets/Disk Reads/Executions」章節。
  3. 取得執行計畫:鎖定目標 SQL_ID 後,使用 DBMS_XPLAN.DISPLAY_CURSOR('sql_id', NULL, 'ALL') 取得實際執行計畫,分析存取路徑、基數估算偏差。
  4. 綁定變數窺探:注意 V$SQLAREA 中同一 SQL 可能有多個子游標(CHILD_NUMBER),需針對特定子游標分析。

延伸工具

  • SQL Tuning Advisor:`DBMS_SQLTUNE` 套件自動分析並給出建議(索引、SQL Profile、改寫)。
  • SQL Monitoring:Oracle 11g+ 即時監控長時間執行 SQL(`V$SQL_MONITOR`)。
  • 第三方工具:Quest TOAD、Oracle SQL Developer、Percona PMM 等圖形化介面更直觀。

結語

找出 Bad SQL 只是第一步,關鍵在於「讀懂執行計畫、理解資料分佈、精準改寫或建立適當索引」。持續建立 SQL 效能基線、定期複盤,才能讓資料庫長期穩定高效運行。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved