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

Administration Oracle Discussion :

Problème de performance suite à un delete


Sujet :

Administration Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Problème de performance suite à un delete
    Bonjour,

    Lorsque nous supprimons quelques dizaines de milliers de lignes dans une table partitionnée - les delete concernent une seule partition, les ordres insert effectués dans cette partition après la suppression ont une performance très dégradée et finissent généralement par un problème avec le tablespace undo (impossible d'étendre le segment par 4 dans le tablespace d'annulation). Les inserts dans d'autres partitions fonctionnent correctement.
    Une partition contient entre 8 et 10 millions d'enregistrements. Les delete - que nous effectuons uniquement en cas d'erreur de chargement soit moins d'une fois par an heureusement - concernent de 50000 à 80000 lignes. Le problème apparait avec un delete global des 50000 ou plus lignes ou avec plusieurs delete de 10000 lignes.
    Le problème a été constaté sur la base de production et reproduit sur la base de développement. Nous sommes sous Oracle 9.2
    Pour retrouver nos performances nous avions tout d'abord sauvegardé les données de la partition, supprimé celle-ci, recréé cette partition et réinséré les données. Dernièrement nous avons effectué un move de la partition suivi d'un rebuild des index.
    Pour quelle raison les performances sont-elles si dégradées après une suppression ?
    Peut-il y avoir une solution pour effectuer un delete qui ne dégrade pas les performances ?
    Est-ce que la solution d'un move de partition est la meilleure pour retrouver les performances ?

  2. #2
    Membre Expert

    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    536
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 536
    Par défaut
    Combien d'indexes existent dans cette tables? Combien d'indexes partitionnés et d'indexes non partitionnés? Y-a-t-il des triggers dans cette table? Y-a-t-il des contraintes d'intégrité dans cette table? Comment se font les inserts? Par direct path ou par un insert conventionnel?

    Comment sont insérées les données en 'temps normal'?

    Lorsque vous supprimez les données d'une partition, vous intervenez sur une seule partition de la table et sur une seule partition des indexes localement partitionnés; par contre les données contenues dans les indexes globaux peuvent être dans n'importe quelle partitions, c'est pourquoi il se peut que vos inserts souffre du temps d'insertion dans les indexes globaux dont l'efficacité se dégrade à cause de ce delete.


    Lorsque vous supprimez la partition et vous la recréer les indexes globaux sont recréés(rebuild) et ne ressemblent donc plus à ce qu'ils étaient étaient après le delete.

    La prochaine fois, tracez les inserts avec un l'event 10046 level 12 afin de voir où se situe réellement le problème

  3. #3
    Invité
    Invité(e)
    Par défaut
    Il existe 29 index bitmap partitionnés sur cette table.
    Un rebuild de ces index sans move de la partition n'améliore pas la rapidité des inserts. J'ai aussi lancé le script d'analyse statistique utilisant dbms_stats.gather_table_stats(granularity => 'PARTITION', degree => 4, estimate_percent => 20, cascade => FALSE) sur la partition considérée sans noter d'amélioration notable dans le cas dégradé.
    Nous n'avons pas d'index globaux sur cette table.
    Nous avons une vingtaine de contrainte d'intégrité référentielle.
    Un trigger BEFORE INSERT OR UPDATE for each row existe sur la table.

    Les inserts se font par datastage via un ordre sql insert. Un test avec une boucle pl/sql lancée sous sqlplus ou toad met en évidence le même problème de dégradation de performance.

    Nous observons dans les fichiers traces qu'il y a beaucoup de
    WAIT #5: nam='db file sequential read'
    pour l'écriture dans la partition sur laquelle la suppression a été effectuée
    alors qu'il y en a très peu pour les inserts dans une autre partition
    par exemple pour une boucle de 99 insertions 4351 WAIT contre 9.

    Quelles autres informations utiles peuvent nous donner les traces ?
    Comment interpréter ces informations ?
    Dernière modification par Invité ; 14/12/2011 à 09h10.

  4. #4
    Membre Expert

    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    536
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 536
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Nous observons dans les fichiers traces qu'il y a beaucoup de 
    WAIT #5: nam='db file sequential read' 
    pour l'écriture dans la partition sur laquelle la suppression a été effectuée
    db file sequential read représente une lecture via indexe. Ce qui veut dire que votre insert est du type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    insert into t1
    select from
          t2
    where
          t2....
    Et peut être même comme suit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    insert into t1
    select from
          t2
    where
          t2....
    and not exists
          (select null
            from t1
           where t1.pk = t2.pk)
    ;
    Est-ce bien ce genre d'insert?

    Il va falloir identifier sur quelle index se font ces db file sequential read.

    Il y a deux ans j'ai résolu un problème de performance relatif à insert/select sur une table partitionnée. 60% du temps de réponse étaient sur un dbfile sequential read. La solution adoptée était la localisation de l'index incriminé (c'etait un index locallement partitionné) et de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        alter index local_ind_t1 parallel 4;
        alter table t1 parallel 4;
    Puisque vous avez reproduit le cas en DEV, pourquoi alors ne pas essayer.

  5. #5
    Expert confirmé
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

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

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    Billets dans le blog
    1
    Par défaut
    Bonjour Mohamed,

    Citation Envoyé par Mohamed.Houri Voir le message
    db file sequential read représente une lecture via indexe.
    Ou peut-être lecture d'undo ? il y a quand même eu plein de delete sur ces blocs. Et un block cleanout à faire...

    regal,
    ce serait intéressant à partir de file# et block# de trouver quel segment subit tous ces i/o (via dba_extents)

    Cordialement,
    Franck.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Ce sont surtout les bitmap index qui donnent lieu à des I/O.
    J'ai créé une table de test contenant les données d'une année sans aucun index ni trigger. Il n'y a aucun problème suite à delete massif. Dès que je crée un index bitmap, je reproduit le problème.
    Par contre à l'exception éventuelle d'une donnée ou le bitmap n'est pas forcément le meilleur choix, l'ensemble des champs indexé ne contient que peu de valeurs différentes ce qui conduit naturellement à choisir des index bitmap.
    Une simple reconstruction de ces index bitmap ne permet pas de retrouver les performances.
    Nous allons donc prescrire à notre client d'effectuer un move de partition lors d'un delete massif (dans notre application ces delete ne sont effectués qu'en cas d'anomalie de chargement donc peu fréquents et peuvent donc donner lieu à des manipulations style move de partition)

  7. #7
    Expert confirmé
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

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

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par regal Voir le message
    Pour quelle raison les performances sont-elles si dégradées après une suppression ?
    Peut être un effet d'ASSM qui met parfois du temps pour trouver les blocs où il y a de la place.
    Citation Envoyé par regal Voir le message
    Peut-il y avoir une solution pour effectuer un delete qui ne dégrade pas les performances ?
    De toute façon, le delete n'est pas optimal sur du gros volume, et ne l'est pas non plus pour les bitmaps index. Donc ici ASSM serait juste une 3ème raison pour ne pas faire de delete
    Citation Envoyé par regal Voir le message
    Est-ce que la solution d'un move de partition est la meilleure pour retrouver les performances ?
    En 9.2 oui certainement. En 10g, un SHRINK pourrait suffire pour le pb d'ASSM. mais il reste les bitmaps, et le coût des delete.

    Cordialement,
    Franck.

Discussions similaires

  1. [11gR2] Problème de performance suite migration Oracle 9i vers Oracle 11g
    Par fifi44680 dans le forum Administration
    Réponses: 8
    Dernier message: 24/05/2014, 00h00
  2. [jeu]problème de performance d'un algo
    Par le Daoud dans le forum Algorithmes et structures de données
    Réponses: 12
    Dernier message: 30/05/2005, 16h07
  3. [C#] Probléme de performance avec IsDbNull
    Par jab dans le forum Windows Forms
    Réponses: 8
    Dernier message: 04/04/2005, 11h39
  4. [oracle 9i][Workbench]Problème de performance
    Par nuke_y dans le forum Oracle
    Réponses: 6
    Dernier message: 03/02/2005, 17h38
  5. [ POSTGRESQL ] Problème de performance
    Par Djouls64 dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 26/05/2003, 16h18

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