dbms_output.put_line

dbms_output.put_line
会降低
plsql
代码的性能吗?     
已邀请:
每增加一行代码都会降低代码的性能。毕竟,它是一个额外的指令要执行,至少消耗一些CPU。所以是的,dbms_output.put_line会降低性能。 真正的问题是:这个额外的代码行的好处是否超过了性能损失?只有你可以回答那个问题。 问候, 抢。     
是的,这是另一段需要执行的代码,但除非输出实际打开,否则我认为开销很小。 这是一个AskTom问题,其中包含更多详细信息:包中是否存在对dbms_output.put_line语句的性能影响?     
您可以查看条件编译,以便DBMS_OUTPUT.PUT_LINE仅在预解析的代码中,如果使用适当的选项编译过程。 一个问题是,是否已调用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次操作记录一次,例如:
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更好;)     
它取决于你调用
dbms_output.put_line
的次数与你在PL / SQL中所做的其他事件的比率。     

要回复问题请先登录注册