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