2014-03-04 91 views
0

我有一個場景,其中我有一個存儲過程,它包含一組sql語句(連接和子查詢的組合,查詢很大,以顯示) ,最後結果是存儲在臨時表中。same查詢正在執行不同的時間間隔

這是由來自前端或程序員的用戶從具有特定權限的後端執行。

這裏的問題是,這個查詢的執行時間有所不同。

有時需要10分鐘,有時需要1小時,但平均耗費時間爲10分鐘,並且一個常見事物總是給出相同數量的記錄(大致相同)。

回答

0

我會檢查查詢的執行計劃,也許有那裏不是總是使用的配置文件。

+0

嗨ErikL,Thnaks爲您的建議,我是新來的oracle和你可以請建議我可以檢查執行計劃和配置文件 –

1

正如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_PROFILEROracle DBMS PROFILER

1

如果你是新的甲骨文,那麼你可以用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; 

這是一點時間消耗這些日誌語句,但可以讓你知道執行時間。稍後,一旦你知道這個問題,你只需刪除/註釋這些行,或者在沒有這些日誌語句的情況下對原始程序進行代碼備份,並在指出問題後重新編譯它。