DBMS_OUTPUT.PUT_LINE

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

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

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

问候,
抢。

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

下面是一个关于AskTom的更多细节的问题:对包里的dbms_output.put_line语句是否有影响?

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

一个问题是,DBMS_OUTPUT.ENABLE被调用。 如果是这样,DBMS_OUTPUT.PUT_LINE中的任何值都将被logging在会话的内存结构中。 如果你继续推动这些东西,并且永远不要把它拿出来(这可能是一些应用服务器连接的情况),你可能会发现在几天之后,你在内存中有很多东西。

我使用日志表而不是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; 

确保你创build你的日志表。 在你的代码中,如果你在一个循环中做了很多操作,你可能只想每个x操作logging一次,如下所示:

 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; 

请注意,自治事务将确保您的日志文件被插入,即使发生错误,并且您还回滚了其他所有内容(因为它是单独的事务)。

希望这有助于…比dbms_output更好;)

这取决于您调用dbms_output.put_line次数与在PL / SQL中执行的次数之比。