コードdbms_output.put_line
のパフォーマンスが低下しますか?plsql
5 に答える
コードが 1 行増えるごとに、コードのパフォーマンスが低下します。結局のところ、これは実行される余分な命令であり、少なくともいくらかの CPU を消費します。そうです、dbms_output.put_line はパフォーマンスを低下させます。
本当の問題は、この余分なコード行の利点がパフォーマンスの低下を上回るかどうかです。その質問に答えられるのはあなただけです。
よろしく、
ロブ。
はい、実行する必要がある別のコードですが、出力が実際にオンにされない限り、オーバーヘッドはごくわずかだと思います。
詳細については、AskTom の質問をご覧ください。パッケージに残っている dbms_output.put_line ステートメントのパフォーマンスへの影響はありますか?
条件付きコンパイルを調べて、プロシージャが適切なオプションでコンパイルされている場合にのみ、DBMS_OUTPUT.PUT_LINEが事前に解析されたコードに含まれるようにすることができます。
1つの質問は、DBMS_OUTPUT.ENABLEが呼び出されたかどうかです。その場合、DBMS_OUTPUT.PUT_LINEの値は、セッションのメモリ構造に記録されます。そこに何かを押し込み続け、決して取り出さない場合(一部のアプリケーションサーバー接続の場合)、数日後にメモリにたくさんのものがあることに気付くかもしれません。
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;
もちろん、ログテーブルを作成してください。コードで、ループ内で多くの操作を実行している場合、次のように、x num 回の操作ごとに 1 回だけログを記録したい場合があります。
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;
自律型トランザクションは、エラーが発生して他のすべてをロールバックした場合でも (別のトランザクションであるため)、ログ stmt が挿入されることを保証することに注意してください。
これが役に立てば幸いです... dbms_outputよりもはるかに優れています;)
これは、PL/SQL での呼び出し回数とその他の操作の比率によって異なりdbms_output.put_line
ます。