dbms_output.put_line - PullRequest
       33

dbms_output.put_line

7 голосов
/ 07 февраля 2011

Уменьшает ли dbms_output.put_line производительность в plsql коде?

Ответы [ 5 ]

8 голосов
/ 07 февраля 2011

Каждая дополнительная строка кода снижает производительность кода.В конце концов, это дополнительная инструкция, которая по крайней мере потребляет некоторый процессор.Так что да, dbms_output.put_line снижает производительность.

Реальный вопрос: перевешивает ли выгода от этой дополнительной строки кода снижение производительности?Только вы можете ответить на этот вопрос.

С уважением,
Роб.

5 голосов
/ 07 февраля 2011

Да, это еще один фрагмент кода, который необходимо выполнить, но, если вывод фактически не включен, я думаю, что издержки весьма минимальны.

Вот вопрос AskTom с более подробной информацией: Есть ли влияние на производительность операторов dbms_output.put_line, оставшихся в пакетах?

4 голосов
/ 08 февраля 2011

Вы можете посмотреть условной компиляции , чтобы DBMS_OUTPUT.PUT_LINE были только в предварительно проанализированном коде, если процедура скомпилирована с соответствующей опцией.

Один вопрос, был ли вызван DBMS_OUTPUT.ENABLE. Если это так, любое значение в DBMS_OUTPUT.PUT_LINE будет записано в структуре памяти сеанса. Если вы продолжите загружать что-то туда и никогда не удаляете его (что может быть в случае некоторых подключений к серверу приложений), вы можете обнаружить, что через несколько дней у вас в памяти будет ОЧЕНЬ много вещей.

3 голосов
/ 07 февраля 2011

Я использую таблицу журнала вместо 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;)

0 голосов
/ 07 февраля 2011

Это зависит от того, сколько раз вы звоните dbms_output.put_line, по сравнению с тем, что вы делаете в PL / SQL.

...