Re: trigger et performance.
Citation:
Envoyé par aline
Est-ce qu'un trigger sur un update ou un delete peux ralentir un insert (même d'un milliardième de seconde!)?
J'aurais dis non, évidemment :? Mais les résultats m'ont complètement surpris ! Voici un petit test :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|
drop table SANS_TRIGGER;
drop table AVEC_TRIGGER;
create table SANS_TRIGGER as select * from all_objects where 1=0;
create table AVEC_TRIGGER as select * from all_objects where 1=0;
create or replace trigger tu_avec_trigger before update on AVEC_TRIGGER
begin
null;
end;
/
alter session set sql_trace=true;
alter session set timed_statistics=true;
insert into SANS_TRIGGER
select *
from ALL_OBJECTS;
commit;
insert into AVEC_TRIGGER
select *
from ALL_OBJECTS;
commit;
alter session set sql_trace=false;
alter session set timed_statistics=false; |
Et le résultat avec TkProf :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
insert into SANS_TRIGGER
select *
from ALL_OBJECTS
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.08 0.09 0 0 0 0
Execute 1 1.58 1.61 688 16098 482 3337
Fetch 0 0.00 0.00 0 0 0 0
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 2 1.66 1.70 688 16098 482 3337
insert into AVEC_TRIGGER
select *
from ALL_OBJECTS
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.09 0.08 0 0 0 0
Execute 1 1.50 1.56 682 16091 481 3337
Fetch 0 0.00 0.00 0 0 0 0
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 2 1.59 1.64 682 16091 481 3337 |
Le temps total est inférieur pour l'insertion dans la table AVEC trigger. Il y a même légèrement moins de bloc lu dans le second cas.
Moralité : mettez partout des triggers qui servent à rien ! (A prendre avec humour bien sûr).
Quelle est l'erreur ?
Au niveau du temps je pense que c'est parce que la seconde requête a profité du cache (lecture sur disque 682 blocs contre 688) mais elle fait quand même moins de logical I/O : 16572 contre 16580...
Quelqu'un a des résultats similaires ? Si oui, comment l'interprétez vous ?
Laly.