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中执行的次数之比。