GLOBAL或會話參數 Oracle是設置了一組初始化參數。如果沒有指定任何內容來覆蓋它們,這些將被默認使用。可以通過使用ALTER SESSION(僅影響單個用戶)或ALTER SYSTEM(影響所有用戶,直到重新啓動Oracle)命令在會話或系統級別更改事件或通過在代碼中使用優化器提示來覆蓋它們。這些可能會影響您看到的計劃。
關於解釋計劃,不同的Oracle數據庫可能有不同的初始化參數或設置了一些會話/系統參數,這可能意味着SAME代碼的行爲不同(通過在一個Oracle數據庫上獲得與另一個Oracle數據庫相比的不同執行計劃數據庫)。
此外,由於執行計劃受所選數據的影響,因此可能在TEST中運行正常的查詢或程序包在數據量更大的PRODUCTION中不會完成。如果代碼沒有使用精確的數據量進行測試(或者如果測試不能像數據一樣保持全部生產量時至少使用從生產數據庫導入的表統計信息),則這是一個常見問題。
示蹤 的建議,到目前爲止,告訴你如何跟蹤單獨聲明假設你知道哪個語句有問題,但你提到你有幾個SQL語句的shell腳本。
如果您使用的是帶有對SQL加上containin這樣幾個SQL語句的單一調用一個在這裏記錄...
#!/bin/ksh
sqlplus -S user/pass <<EOF
set heading off
BEGIN
-- DO YOUR FIRST SQL HERE
-- DO YOUR SECOND SQL HERE
END;
/
EOF
...你可以創建這樣
一個Oracle跟蹤文件
#!/bin/ksh
sqlplus -S user/pass <<EOF
set heading off
BEGIN
ALTER SESSION SET EVENTS '10046 trace name context forever, level 8'
-- DO YOUR FIRST SQL HERE
-- DO YOUR SECOND SQL HERE
END;
/
EOF
- 請注意,級別8用於跟蹤WAITS。你可以做4級(綁定變量)和12級(綁定和等待),但我總是發現8級的問題。級別12還可能需要更長的時間才能在全尺寸環境中執行。
現在運行shell腳本做單的執行,然後檢查您的跟蹤文件在SQL創建PLUS使用
SQL> show parameter user_dump_dest
/app/oracle/admin/rms/udump
進入該目錄,如果沒有其他跟蹤已啓用,有將是一個.trc文件,其中包含腳本中整個SQL運行的跟蹤。
您需要使用UNIX命令TKPROF這樣
unix> tkprof your.trc ~/your.prf sys=no sort=fchela,exeela
將此轉換爲可讀格式現在切換到你的主目錄,並會出現在這些順序列出了SQL語句的.prf文件採取最多的執行時間或獲取時間與解釋計劃一起執行。 tkprof的這組參數使您能夠專注於修復花費時間最長的語句,從而獲得最大的調整回報。
請注意,如果您的shell腳本運行多個sqlplus命令,則每個命令都會創建一個單獨的會話,因此向每個會話添加ALTER SESSION語句將創建單獨的跟蹤文件。
此外,不要忘記,它很容易迷失在細節中,有時調整是關於查看整體圖片,並以另一種方式做同樣的事情,而不是從一個可能獲得幾秒鐘的單一SQL開始,在整體方案中並不有助於減少整體運行時間。
如果可以,儘量減少更新語句的數量,就好像您有一個大表一樣,如果您可以在表中執行一次更新(並且支持更新的索引),那麼效率會更高比做很多小的更新。
也許您可以發佈腳本的相關部分,運行所需的總時間以及需要更多幫助的解釋計劃。