長時間執行的語句不受 Oracle 監控
我們試圖找出為什麼(相當複雜的)語句在執行時具有極高的差異。有時只需要“分鐘”(大約 40-50 分鐘),有時甚至在 12 小時後也沒有完成。
我通常的解決此類問題的方法是檢查語句是否被監控,如果是,則使用它來“實時”執行它,
dbms_sqltune.report_sql_monitor()
這樣我就可以查明執行中的瓶頸。但是,Oracle 永遠不會監視該特定語句。根據 Oracle 手冊,如果出現以下情況,則會監控語句:
預設情況下,當 SQL 語句並行執行或在單次執行中消耗了至少 5 秒的 CPU 和 I/O 組合時間時,將自動啟動 SQL 監控
由於此語句執行時間大大超過 5 秒並使用並行執行,因此應對其進行監視。
我們甚至添加了提示
gather_plan_statistics
和monitor
SQL 來強制監控語句,但它仍然沒有被監控。根據“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 語句)