IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

Purge de table, trigger et performance


Sujet :

PL/SQL Oracle

  1. #1
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 117
    Points : 219
    Points
    219
    Par défaut 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 : 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 !

    Mon petit blog sans prétention : http://blog.octera.info/

  2. #2
    Membre habitué Avatar de Laurent_du_78
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    138
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Juin 2007
    Messages : 138
    Points : 188
    Points
    188
    Par défaut
    Bonjour
    A chaque insert tu fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT count(MSGID) INTO v_count FROM ERROR_TABLE ;


    La purge doit être réaliser en masse de façon régulirere (tous les jours, toutes les heures etc ...), mais surtout pas pendant les inserts.
    Peux tu partitionner sur une colonne date et réaliser des rotations de partitions ?
    Amicalement
    24h-en-piste.com

  3. #3
    Expert éminent
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 821
    Points : 6 443
    Points
    6 443
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Une table permanente n'est probablement pas la bonne solution pour stoker un buffer de 10000 lignes. Le SGBD fait beaucoup de travail (undo, redo) pour assurer la durabilité des données, ce qui est inutile ici. 10000 lignes c'est quelque chose qui devrait se trouver en mémoire je pense.
    Cordialement,
    Franck.
    Franck Pachot - Developer Advocate Yugabyte 🚀 Base de Données distribuée, open source, compatible PostgreSQL
    🗣 twitter: @FranckPachot - 📝 blog: blog.pachot.net - 🎧 podcast en français : https://anchor.fm/franckpachot

Discussions similaires

  1. Table / VUE Materialisée / Performance
    Par Narold dans le forum SQL
    Réponses: 14
    Dernier message: 24/09/2007, 16h38
  2. Table / VUE Materialisée / Performance
    Par Narold dans le forum SQL
    Réponses: 0
    Dernier message: 20/09/2007, 15h41
  3. Réponses: 3
    Dernier message: 04/07/2006, 17h07
  4. [ASE][12.5] purge de table automatique
    Par benssj5 dans le forum Sybase
    Réponses: 3
    Dernier message: 05/01/2006, 09h10
  5. trigger et performance.
    Par aline dans le forum Oracle
    Réponses: 12
    Dernier message: 22/02/2005, 09h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo