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 :
Auriez-vous des conseils ? Une meilleur idées ?
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;
Merci d’avance !
Partager