会dbms_output.put_line
降低plsql
代码的性能吗?
5 回答
每一行额外的代码都会降低代码的性能。毕竟是要执行的额外指令,至少会消耗一些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 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 好得多;)
这取决于您调用的次数dbms_output.put_line
与您在 PL/SQL 中执行的其他操作的比率。