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.
Каждую дополнительная строка кода снижает производительность кода. В конце концов, это дополнительная инструкция для выполнения, которая, по крайней мере, потребляет некоторый процессор. Так что да, dbms_output.put_line снижает производительность.
Реальный вопрос: может ли преимущество этой дополнительной строки кода превышать штраф за исполнение? Только ты можешь ответить на этот вопрос.
С уважением,
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;
Убедитесь, что вы создаете таблицу журнала, конечно. В вашем коде, если вы делаете много операций в цикле, вы можете войти только один раз в й питы операциях, что-то вроде:
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'. – Allan
Вы действительно не хотите, чтобы в производственном коде была группа dbms_output.put_lines. Это верно с кодом, который входит в любой цикл;) – tbone
Вы можете посмотреть в conditional compilation так что DBMS_OUTPUT.PUT_LINE только в предварительно разобрана коде, если процедура компилируется с соответствующей опцией.
Вопрос в том, был вызван DBMS_OUTPUT.ENABLE. Если это так, любое значение в DBMS_OUTPUT.PUT_LINE будет записано в структуре памяти сеанса. Если вы продолжаете подталкивать туда вещи и никогда не вынимаете их (что может быть в случае с некоторыми подключениями к серверу приложений), вы можете обнаружить, что через несколько дней у вас будет много материала в памяти.
Другим важным фактором является то, какие выражения используются для создания параметра для него, например. 'dbms_output.put_line (my_slow_function())' –