2011-02-07 1 views

ответ

0

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

+1

Другим важным фактором является то, какие выражения используются для создания параметра для него, например. 'dbms_output.put_line (my_slow_function())' –

7

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

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

С уважением,
Rob.

2

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

+0

Это, как правило, хорошее решение, но поскольку исходный плакат обеспокоен накладными расходами, это может быть намного хуже. Автономные транзакции занимают значительно больше времени, чем вызовы 'dbms_output.put_line'. – Allan

+2

Вы действительно не хотите, чтобы в производственном коде была группа dbms_output.put_lines. Это верно с кодом, который входит в любой цикл;) – tbone

4

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

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