Purge de table, trigger et performance
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:
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 !