7

dbms_output.put_line降低plsql代码的性能吗?

4

5 回答 5

8

每一行额外的代码都会降低代码的性能。毕竟是要执行的额外指令,至少会消耗一些CPU。所以是的, dbms_output.put_line 会降低性能。

真正的问题是:这行额外代码的好处是否超过了性能损失?只有你可以回答那个问题。

问候,
罗布。

于 2011-02-07T09:06:24.803 回答
5

是的,这是需要执行的另一段代码,但除非实际打开输出,否则我认为开销非常小。

这是一个包含更多详细信息的 AskTom 问题:包中的 dbms_output.put_line 语句是否会影响性能?

于 2011-02-07T09:05:18.383 回答
4

您可以查看条件汇编,以便DBMS_OUTPUT.PUT_LINE仅在预先放置的代码中使用,如果使用适当的选项编译了该过程。

一个问题是,是否调用了 DBMS_OUTPUT.ENABLE。如果是这样,DBMS_OUTPUT.PUT_LINE 中的任何值都将记录在会话的内存结构中。如果你继续往里面推送东西并且从不取出它(这可能是一些应用服务器连接的情况),你可能会发现几天后你的内存中有很多东西。

于 2011-02-07T22:50:15.643 回答
3

我使用日志表而不是 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 操作只记录一次,例如:

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 好得多;)

于 2011-02-07T13:42:22.390 回答
0

这取决于您调用的次数dbms_output.put_line与您在 PL/SQL 中执行的其他操作的比率。

于 2011-02-07T09:06:13.197 回答