dbms_output.put_line
在plsql
代码中的性能是否下降?dbms_output.put_line
回答
是的,这是另一段需要执行的代码,但除非输出实际打开,否则我认为开销很小。
这里有一个问题AskTom更多的细节:Is there a performance impact for dbms_output.put_line statements left in packages?
这取决于你有多少次打电话dbms_output.put_line
与你在PL/SQL做些什么的比率。
每个额外的一行代码会降低代码的性能。毕竟,这是一个额外的指令被执行,至少会消耗一些CPU。所以是的,dbms_output.put_line会降低性能。
真正的问题是:这个额外的代码行的好处是否超过了性能损失?只有你可以回答那个问题。
Regards,
Rob。
我使用日志表而不是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;
注意,自治事务将确保日志语句被插入,即使发生错误并且您还原其他所有内容(因为它是单独的事务)。
希望这有助于...比DBMS_OUTPUT好得多;)
这通常是一个很好的解决方案,但由于原始的海报关注开销,这可能会更糟糕。与对`dbms_output.put_line`的调用相比,自治事务处理花费的时间要长得多。 – Allan 2011-02-07 19:03:51
你可以看看conditional compilation,使DBMS_OUTPUT.PUT_LINE仅在预解析的代码,如果该程序与相应的选项编译。
一个问题是,是否调用了DBMS_OUTPUT.ENABLE。 如果是这样,DBMS_OUTPUT.PUT_LINE中的任何值都将记录在会话的内存结构中。如果你继续推动那些东西并且永远不会把它拿出来(这可能是一些应用服务器连接的情况),你可能会发现在几天后你的内存中有很多东西。
- 1. DBMS_OUTPUT.PUT_LINE not printing
- 2. DBMS_OUTPUT.PUT_LINE手续
- 3. 立即执行DBMS_OUTPUT.PUT_LINE
- 4. dbms_output.put_line中的换行符
- 5. DBMS_OUTPUT.PUT_LINE()的PL/SQL别名?
- 6. 用dbms_output.put_line检测最后一行
- 7. 使用QtSql获取dbms_output.put_line的Oracle输出
- 8. 使用Dbms_Output.Put_Line无法看到结果
- 9. DBMS_OUTPUT.PUT_LINE不打印任何东西
- 10. 运行PLSQL并获得DBMS_OUTPUT.PUT_LINE(警予)
- 11. 如何执行dbms_output.put_line的结果
- 12. 是否有可能在ODP中捕获DBMS_OUTPUT.PUT_LINE。管理网12 c
- 13. 的ExecuteNonQuery返回-1调用时(BEGIN DBMS_OUTPUT.PUT_LINE(1); END;)的Oracle
- 14. 如何防止dbms_output.put_line修剪前导空白?
- 15. dbms_output.put()与dbms_output.put_line()的缓冲方式不同吗?
- 16. dbms_output.put_line即使在'set serveroutput on'后也不打印内部过程
- 17. 如何格式化由dbms_output.put_line PL/SQL生成的表?
- 18. 如何在Dbms_output.put_line('');中使用<br>标记在PL/SQL Oracle?
- 19. 如何将“dbms_output.put_line内容”重定向到TimesTen存储过程的日志文件
- 20. 在PL/SQL中学习绑定变量以及计算输入和输出DBMS_OUTPUT.PUT_LINE
- 21. 游标属性%NOTFOUND作为退出语句中使用<code>dbms_output.put_line</code>返回混乱的结果
- 22. 如何在不使用PL/SQL中的dbms_output.put_line的情况下一次显示数组的多个值
- 23. 在Oracle PL/SQL中使用dbms_output.put_line时错误的参数数量或类型错误
- 24. 如何在没有dbms_output.put_line的情况下输出pl/sql动态选择中的所有行
- 25. ORA-00972标识符太长 - 声明语句
- 26. 触发器和计数(*)不起作用
- 27. PL/SQL ORA-01422:精确提取返回的请求数超过要求的行数
- 28. PLS-00221:'DISPLAY_TRANS'不是程序或未定义
- 29. PL/SQL中的APEX_JSON.get_varchar2
- 30. 虽然我调用过程,它给我的错误:ORA-06553:PLS-306:错误的数量或类型的呼叫参数phone_info
另一个重要因素是使用什么样的表达式来构建参数,例如, `dbms_output.put_line(my_slow_function())` – 2011-02-08 00:49:49