Bonjour !

Nous avons une table alimentée par un EAI, sur celle-ci une purge manuelle est à effectuer, l’EAI n’occupant pas de cette action. Pour éviter d’exploser le tablespace (et par la même occasion faire planté l’EAI) si un trop grand nombre d’erreurs arrive d’un coup, nous avons retenu l’option d’un trigger qui lors de l’insertion purge les entrées les plus vieilles.
Nous limitons le nombre d’entrées dans la table à 10000 ;
Nous avons au début choisi de ne purger que l’entrée la plus vieille lors d’une insertion (une entrée insérée = une entrée supprimée), mais les performances étaient horribles avec cette solution.
En conséquence, nous sommes parties sur la solution de purger 2000 lignes lorsque l’on insère la 10001ème. Les performances sont nettement meilleures, mais toujours 4 fois inférieures aux performances initiales sans trigger.

Insertion de 75 000 entrées dans la table
Sans trigger et sans purge 15 secondes
Trigger purgeant une ligne à chaque insertion 17 minutes
Trigger purgeant 2000 ligne lors de l’insertion de la 10001ème 60 secondes

Voici le trigger que nous avons mis en place :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE OR REPLACE TRIGGER purgeErrorTable
AFTER INSERT ON ERROR_TABLE
DECLARE
   v_count int;
 
BEGIN
   select count(MSGID) into v_count from ERROR_TABLE ;
   IF v_count > 10000 then
      DELETE FROM ERROR_TABLE
        WHERE  rowid in (SELECT rwd
                     FROM (select rowid rwd,row_number() over (order by AUDITTIMESTAMP ASC) rn from ERROR_TABLE)
                     where rn <=2000);
   END IF;
END;
Auriez-vous des conseils ? Une meilleur idées ?

Merci d’avance !