Oracle

長時間執行的語句不受 Oracle 監控

  • December 19, 2017

我們試圖找出為什麼(相當複雜的)語句在執行時具有極高的差異。有時只需要“分鐘”(大約 40-50 分鐘),有時甚至在 12 小時後也沒有完成。

我通常的解決此類問題的方法是檢查語句是否被監控,如果是,則使用它來“實時”執行它,dbms_sqltune.report_sql_monitor()這樣我就可以查明執行中的瓶頸。

但是,Oracle 永遠不會監視該特定語句。根據 Oracle 手冊,如果出現以下情況,則會監控語句:

預設情況下,當 SQL 語句並行執行或在單次執行中消耗了至少 5 秒的 CPU 和 I/O 組合時間時,將自動啟動 SQL 監控

由於此語句執行時間大大超過 5 秒使用並行執行,因此應對其進行監視。

我們甚至添加了提示gather_plan_statisticsmonitorSQL 來強制監控語句,但它仍然沒有被監控。

根據“My Oracle Support”(DocID:1613163.1),監控僅限於計劃少於 300 行的語句。當我生成計劃時,它有 282 行(=計劃中的最高行 ID),因此不應妨礙監控。

有一個隱藏參數 ( "_sqlmon_max_planlines") 控制它,但這是一個託管數據庫伺服器,更改類似的東西非常複雜。

所以我的問題是:

對於 Oracle 為何不監視語句,是否還有其他(可能未記錄)限制?


這是 Oracle 11.2.0.3 企業版(計劃升級到 11.2.0.4,但這可能需要一些時間)。

有問題的聲明有多個計劃(準確地說是 13 個),由於某種原因,這些計劃沒有被dbms_xplan.display_cursor(). 該函式返回的計劃是少於 300 行的計劃,而其他計劃則超過 300 行。

託管合作夥伴將"_sqlmon_max_planlines"參數增加到 500 後,現在監控該語句。

如果您知道 SQL_ID,您還可以發出:

ALTER SYSTEM SET EVENTS 'sql_monitor [sql: 5hc07qvt8v737] force=true';

確保進行監控(例如,即使是短期執行的 SQL 語句)

引用自:https://dba.stackexchange.com/questions/191968