¿dbms_output.put_line
disminuye el rendimiento en el código plsql
?dbms_output.put_line
Respuesta
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í es una pregunta AskTom con más detalles: Is there a performance impact for dbms_output.put_line statements left in packages?
Depende de la relación de cuántas veces se llama a dbms_output.put_line
frente a lo que otra cosa que hacer en PL/SQL.
Cada línea de código adicional 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 de código adicional supera la penalización de rendimiento? Sólo usted puede contestar a esa pregunta.
Saludos,
Rob.
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 está haciendo muchas operaciones en un bucle, es posible que desee conectarse solamente a una vez por operaciones x num, algo así 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 registro se inserta stmt , 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;)
Esta es generalmente una buena solución, pero como el cartel original está preocupado por la sobrecarga, podría ser mucho peor. Las transacciones autónomas tardan mucho más en procesarse que las llamadas a 'dbms_output.put_line'. – Allan
Realmente no desea un conjunto de dbms_output.put_lines en el código de producción. Esto es especialmente cierto con el código que ingresa en cualquier bucle;) – tbone
se puede mirar en conditional compilation para que el DBMS_OUTPUT.PUT_LINE son sólo en el código pre-analizada 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 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.
- 1. DBMS_OUTPUT.PUT_LINE no imprime
- 2. ¿Cómo redirigir la salida de DBMS_OUTPUT.PUT_LINE a un archivo?
- 3. Cómo evitar que dbms_output.put_line recorte los espacios en blanco iniciales?
- 4. ORA-29270: demasiados HTTP abiertas solicita
- 5. Crear o simular matrices bidimensionales en PL/SQL
- 6. PLSQL Procudure (Oracle) Comparando una variable en where clause
- 7. El identificador debe ser declarado? PL error/SQL
- 8. soltando una tabla temporal global
- 9. Llamar a un procedimiento almacenado con otro en Oracle
- 10. PL/SQL, ¿cómo escapar de comillas simples en una cadena?
- 11. ¿Por qué falla esta comprobación de matriz asociativa nula en PL/SQL?
- 12. trabajo con json en oráculo
- 13. Cómo ejecutar secuencias de comandos SQL de un procedimiento de SQL PL
- 14. Bucle a través de los valores pre definido
- 15. Excepciones de PL/SQL en la actualización/eliminación de la fila no existente
- 16. Obteniendo índice de elemento en la colección PL/SQL
- 17. Imprimir información de depuración del procedimiento almacenado en MySQL
- 18. condiciones de las pilas en estado instrucción CASE en PL/SQL
- 19. Problema rudimentario: ¿salida básica de la consola PL/SQL?
- 20. ¿Cómo imprimo la salida en una nueva línea en PL/SQL?
- 21. Usando el Cursor de Ref en Oracle SQL Developer
- 22. Oracle PL/SQL - Elevar la excepción definida por el usuario con SQLERRM personalizado
- 23. La función que devuelve booleano falla en "la expresión es del tipo incorrecto"
- 24. Recuperar el valor de un elemento xml en Oracle PL SQL
- 25. oracle plsql: recuperar los valores de los parámetros de tiempo de ejecución cuando se llama a un procedimiento
- 26. Try Catch Como control de excepciones En PL/SQL
- 27. Imprimir el valor de una variable en SQL Developer
- 28. ¿Los cursores de la base de datos recogen los cambios en los datos subyacentes?
- 29. ¿Cómo ejecutar un procedimiento almacenado de Oracle?
- 30. Cómo imprimir una cadena utilizando pl/sql sin agregar el carácter de nueva línea al final
Otro factor importante es qué tipo de expresiones se utilizan para construir el parámetro, p. Ej. 'dbms_output.put_line (my_slow_function())' –