performance oracle plsql dbms-output

performance - dbms_output.put_line



oracle plsql (5)

¿ dbms_output.put_line disminuye el rendimiento en el código plsql ?


Depende de la proporción de cuántas veces llama a dbms_output.put_line frente a lo que hace en PL / SQL.


Puede buscar en la compilación condicional para que DBMS_OUTPUT.PUT_LINE esté solo en el código pre-analizado si el procedimiento se compila con la opción apropiada.

Una pregunta es, se ha llamado DBMS_OUTPUT.ENABLE. Si es así, cualquier valor en un DBMS_OUTPUT.PUT_LINE se grabará en la estructura de la memoria de la sesión. Si continúas empujando cosas y nunca quitándolas (lo que podría ser el caso con algunas conexiones de servidores de aplicaciones), es posible que después de unos días tengas muchas cosas en la memoria.



Cada línea adicional de código disminuye el rendimiento del código. Después de todo, es una instrucción adicional para ser ejecutada, que al menos consume algo de CPU. Entonces, sí, dbms_output.put_line disminuye el rendimiento.

La verdadera pregunta es: ¿el beneficio de esta línea adicional de código supera la penalización de rendimiento? Sólo usted puede contestar a esa pregunta.

Saludos,
Robar.


Utilizo una tabla de registro en lugar de dbms_output. Asegúrese de configurar como transacción autónoma, algo así como (modificar para sus necesidades, por supuesto):

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;

Asegúrese de crear su tabla de registro, por supuesto. En su código, si realiza muchas operaciones en un bucle, es posible que desee registrar solo una vez por cada operación num, algo como:

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;

Tenga en cuenta que la transacción autónoma se asegurará de que su log stmt se inserte, incluso si ocurre un error y restituye todo lo demás (ya que es una transacción separada).

Espero que esto ayude ... mucho mejor que dbms_output;)