我有一個場景,其中我有一個存儲過程,它包含一組sql語句(連接和子查詢的組合,查詢很大,以顯示) ,最後結果是存儲在臨時表中。same查詢正在執行不同的時間間隔
這是由來自前端或程序員的用戶從具有特定權限的後端執行。
這裏的問題是,這個查詢的執行時間有所不同。
有時需要10分鐘,有時需要1小時,但平均耗費時間爲10分鐘,並且一個常見事物總是給出相同數量的記錄(大致相同)。
我有一個場景,其中我有一個存儲過程,它包含一組sql語句(連接和子查詢的組合,查詢很大,以顯示) ,最後結果是存儲在臨時表中。same查詢正在執行不同的時間間隔
這是由來自前端或程序員的用戶從具有特定權限的後端執行。
這裏的問題是,這個查詢的執行時間有所不同。
有時需要10分鐘,有時需要1小時,但平均耗費時間爲10分鐘,並且一個常見事物總是給出相同數量的記錄(大致相同)。
我會檢查查詢的執行計劃,也許有那裏不是總是使用的配置文件。
正如ErikL所述,檢查查詢的執行計劃是一個好的開始。在Oracle 11g
中,您可以使用DBMS_PROFILER
。這會爲您提供有關違規聲明的信息。我會多次運行它並查看多次運行時間之間的區別。首先檢查您是否安裝了DBMS_PROFILER
。我相信它是作爲一個獨立的軟件包而來的。
啓動Profiler:
SQL> execute dbms_profiler.start_profiler('your_procedure_name');
運行存儲過程:
SQL> exec your_procedure_name
停止Profiler:
SQL> execute dbms_profiler.stop_profiler;
這會向您顯示您的存儲過程中的所有語句及其相關的運行時間,這樣您可以將問題縮小爲可能導致差異的單個查詢。
這裏是Oracle
DOC上DBMS_PROFILER
: Oracle DBMS PROFILER
如果你是新的甲骨文,那麼你可以用DBMS_OUTPUT或使用記錄表來存儲中間的執行時間,這樣你就會知道哪些SQL是造成問題。
declare
run_nbr number;
begin
run_nbr = 1; -- or get it from sequence
SQL1;
log(run_nbr ,user,'sql1',sysdate);
SQL2;
log(run_nbr ,user,'sql2',sysdate);
commit;
end;
這裏登錄過程無非是簡單的插入語句將插入表說:「日誌」,並具有最少列說run_nbr,用戶sql_name,execution_date
procedure log(run_nbr number, user varchar2, sql_name varchar2, execution_date date)
is
begin
insert into log values(run_nbr, user, sql_name, execution_date);
-- commit; -- Un-comment if you are using pragma autonomous_transaction
end;
這是一點時間消耗這些日誌語句,但可以讓你知道執行時間。稍後,一旦你知道這個問題,你只需刪除/註釋這些行,或者在沒有這些日誌語句的情況下對原始程序進行代碼備份,並在指出問題後重新編譯它。
或者如果沒有解決這個問題,您還可以嘗試跟蹤從前端調用SP的會話。這裏有一個非常好的跟蹤說明:http://tinky2jed.wordpress.com/technical-stuff/oracle-stuff/what-is-the-correct-way-to-trace-a-session-in-oracle/
嗨ErikL,Thnaks爲您的建議,我是新來的oracle和你可以請建議我可以檢查執行計劃和配置文件 –