performance - variable - set dbms_output on




dbms_output.put_line (4)

Est- dbms_output.put_line que dbms_output.put_line diminue les performances du code plsql ?


Cela dépend du nombre de fois que vous appelez dbms_output.put_line par rapport à ce que vous faites en PL / SQL.



Chaque ligne de code supplémentaire diminue les performances du code. Après tout, c'est une instruction supplémentaire à exécuter, qui consomme au moins un peu de CPU. Donc oui, dbms_output.put_line diminue les performances.

La vraie question est la suivante: l'avantage de cette ligne de code supplémentaire l'emporte-t-il sur la pénalité de performance? Vous seul pouvez répondre à cette question.

Cordialement,
Rob.


J'utilise une table de journal au lieu de dbms_output. Assurez-vous de configurer en tant que transaction autonome, quelque chose comme (modifier pour vos besoins bien sûr):

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;

Assurez-vous de créer votre table de notation bien sûr. Dans votre code, si vous effectuez de nombreuses opérations dans une boucle, vous voudrez peut-être vous connecter uniquement une fois par opération x num, quelque chose comme:

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;

Notez que la transaction autonome veillera à ce que votre fichier journal soit inséré, même si une erreur survient et que vous annulez tout le reste (puisqu'il s'agit d'une transaction distincte).

J'espère que cela aide ... beaucoup mieux que dbms_output;)





dbms-output