2011-02-07 9 views

答えて

0

はここで、より詳細でAskTomの質問です。

+1

もう1つの大きな要因は、パラメータを作成するためにどのような種類の式を使用するかです。 'dbms_output.put_line(my_slow_function())' –

7

すべてのコード行がコードのパフォーマンスを低下させます。結局のところ、少なくとも余分なCPUを消費する余分な命令です。したがって、dbms_output.put_lineはパフォーマンスを低下させます。

実際の質問です:コードのこの余分な行の利点はパフォーマンスのペナルティを上回っていますか?あなただけがその質問に答えることができます。

よろしくお願いします。
Rob。

2

私はdbms_outputの代わりにログテーブルを使用します。 (もちろん、あなたのニーズに合わせて変更)、自律型トランザクションとして設定するようなものを確認してください:

create or replace package body somePackage as 
... 
procedure ins_log(
i_msg in varchar2, 
i_msg_type in varchar2, 
i_msg_code in number default 0, 
i_msg_context in varchar2 default null 
) IS PRAGMA AUTONOMOUS_TRANSACTION; 

begin 

    insert into myLogTable 
    (
    created_date, 
    msg, 
    msg_type, 
    msg_code, 
    msg_context 
) 
    values 
    (
    sysdate, 
    i_msg, 
    i_msg_type, 
    i_msg_code, 
    i_msg_context 
); 

    commit; 

end ins_log; 
... 

end; 

あなたはもちろんのログテーブルを作成していることを確認します。自律型トランザクションは、あなたのログのstmtが挿入されることを保証すること

create or replace myProcedure as 
    cursor some_cursor is 
    select * from someTable; 

    v_ctr pls_integer := 0; 

begin 

for rec in some_cursor 
loop 
    v_ctr := v_ctr + 1; 

    -- do something interesting 

    if (mod(v_ctr, 1000) = 0) then 
    somePackage.ins_log('Inserted ' || v_ctr || ' records', 
         'Log', 
         i_msg_context=>'myProcedure'); 
    end if; 

end loop; 
commit; 

exception 
    when others then 
    somePackage.ins_log(SQLERRM, 'Err', i_msg_context=>'myProcedure'); 
    rollback; 
    raise; 
end; 

注:あなたがループ内で多くの操作をやっている場合は、あなたのコードでは、あなただけのx numの操作、何かのように一度ログインすることもできますエラーが発生して、他のすべてのトランザクションをロールバックしても(別のトランザクション以降に)

・ホープ、このことができます... DBMS_OUTPUTよりもはるかに良いが、)

+0

これは一般的には良い解決策ですが、オリジナルのポスターではオーバーヘッドが懸念されるため、これはもっと悪くなる可能性があります。自律型トランザクションは、 'dbms_output.put_line'の呼び出しよりも処理にかなり時間がかかります。 – Allan

+2

dbms_output.put_linesは実動コードでは必要ありません。これは、ループに入るコードでは真です。 – tbone

4

手順が適切なオプションでコンパイルされている場合DBMS_OUTPUT.PUT_LINEは事前に解析されたコードの中で唯一になるように、あなたがconditional compilationに見ることができます。

1つの質問は、DBMS_OUTPUT.ENABLEがコールされたことです。 この場合、DBMS_OUTPUT.PUT_LINEの値はセッションのメモリー構造に記録されます。あなたがそこに物を押し込んで、決して取り出していない場合(アプリケーションサーバーの接続によってはそうかもしれない)、数日後にメモリにたくさんのものがあるかもしれません。

関連する問題