1. 程式人生 > 其它 >mongotemplate 查詢子文件_Oracle之SQL查詢突破效能瓶頸的引數

mongotemplate 查詢子文件_Oracle之SQL查詢突破效能瓶頸的引數

技術標籤:mongotemplate 查詢子文件

這兩天為客戶排查生產環境上一個SQL的查詢效能問題

現象:

1、兩萬當量的返回結果(資料總量在幾十萬量級)

生產環境:耗時在30min左右

測試環境:耗時在但是在本地測試環境和客戶的測試環境效能都還是可以的,大概在10min以內

以下是我排查的思路:

一、由於同一段SQL在不同的環境差距太大,就重新收集了所用資料庫物件的統計資訊,測試無果

二、查看了執行計劃,顯示大表走了全表掃描,但是我需要的返回結果是全量級別的資料,而非部分資料的返回,並且非主鍵使用了'<>'(主鍵使用<>會依然走索引),也破壞了走索引的這項規則,在綜合評估之後,感覺走全表掃描就是最優解,所以就沒有通過hints的方式去人工干預SQL的執行計劃!

三、改便SQL寫法,使用nvl()的情況改用union all 的方式,測試之,收效甚微!

四、老大建議將select 後面的子查詢放在from 後面,測試之,結果依舊不理想!

五、將驅動表(即選擇小資料量的表)放在from 的最後,測試發現還是沒有效果,為什麼沒有效果呢?因為這種方式是在RBO時代有效,但是在CBO(Oracle 9i之後)時代是沒有效果的,因為CBO會自動的去找驅動表,

排查到這裡發現已經排查不下去了,感覺就是環境在作怪!

後來現場實施發來了一個客戶自己給出的建議,這個方案是客戶在購買了Oracle服務之後由Oracle方面出具的方案,那就是修改了以下這個系統引數;

sqlplus as sysdba;alter system set resource_manager_plan='' scope=both;

實施人員在測試之後,由原來的30分鐘提升到了15s !!

以下為Oracle官方文件:

52a3abc85e221d78ab55314809371fe9.png

說明翻譯:

RESOURCE_MANAGER_PLAN指定要為例項使用的頂級資源計劃。資源管理器將載入此頂級計劃及其所有子專案(子計劃、指令和使用者組)。如果沒有指定此引數,資源管理器在預設情況下是關閉的。

您可以使用ALTER SYSTEM語句更改此引數的設定,以開啟資源管理器(如果它以前是關閉的)或關閉資源管理器或更改當前計劃(如果它以前是開啟的)。如果指定資料字典中不存在的計劃,Oracle將返回一條錯誤訊息。

希望對各位有所幫助!