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.
Sí, es otro código que debe ejecutarse, pero a menos que la salida esté realmente activada, creo que la sobrecarga es mínima.
Aquí hay una pregunta AskTom con más detalles: ¿Hay un impacto en el rendimiento de las instrucciones dbms_output.put_line que quedan en los paquetes?
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;)