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 :

rebuild (ou pas) des indexes d'une table "géante"


Sujet :

Administration Oracle

  1. #1
    Membre régulier Avatar de taha1
    Femme Profil pro
    débutantE ^ ^
    Inscrit en
    Mai 2009
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : débutantE ^ ^

    Informations forums :
    Inscription : Mai 2009
    Messages : 106
    Points : 105
    Points
    105
    Par défaut rebuild (ou pas) des indexes d'une table "géante"
    Bonjour,

    Mon souci c'est que j'ai une table qui compte une dizaine de milliers d'enregistrements et les opérations de suppression sont relativement longues voir impossible si il y a (des like dans les requêtes, je peux comprendre puisque la taille de la table est énorme mais bon), je ne suis pas dba donc si je soupçonne les index (et que je veux les rebuilder), il faut d'abord vérifier l'état des index :

    alors j'ai vu qu'il ya
    Analyse nom_index validate structure
    ou bien
    dbms_stats.gather_index_stats

    le grand problème c'est que je ne connais pas le coût de ces deux opérations en terme de blocage des transactions DML sur la table concernée.
    quelcun pourra m'éclaircir sur le sujet ou peut être me donner une méthode plus soft car la table est tj utilisée et il n ya pas des moments où le traffic baisse

    merci

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 394
    Points
    18 394
    Par défaut
    Vous devriez envisager le COALESCE.

  3. #3
    Membre régulier Avatar de taha1
    Femme Profil pro
    débutantE ^ ^
    Inscrit en
    Mai 2009
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : débutantE ^ ^

    Informations forums :
    Inscription : Mai 2009
    Messages : 106
    Points : 105
    Points
    105
    Par défaut

    ça me fait de la doc oki je vais regarder merci

  4. #4
    Membre expérimenté

    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
    Points : 1 359
    Points
    1 359
    Par défaut
    Bonjour,

    En oracle il ne faut pas soupçonner ; il faut plutôt d’abord savoir pourquoi les deletes sont très lents. Pour cela vous devez soit (a) avoir l’explain plan du delete soit (a) activer le 10046 trace event afin de voir la cause réelle de la lenteur du delete.
    Quant au coalesce des indexes proposé ici, si tant est que votre problème vienne des indexes, il faut savoir qu’il existe une fonction interne Oracle (sys_op_lbid) qui permet d’analyser un index afin de connaitre la répartition de ses leaf_blocks par clés. C’est grâce à cette répartition que vous pourriez décider de faire un coalesce ou pas d’un index. Généralement, se sont les indexes basés sur une séquence (right hand index) qui ne font qu’augmenter en allant vers la droite et qui subissent des deletes sur leur gauche qui sont généralement candidats à un coalesce.

    Mohamed Houri

  5. #5
    Expert confirmé
    Avatar de doc malkovich
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Juillet 2008
    Messages
    1 884
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 884
    Points : 4 285
    Points
    4 285
    Billets dans le blog
    1
    Par défaut
    Hello,

    En BI on manipule des tables de volumétrie importante, tu fais beaucoup de delete ?
    Si c'est le cas une astuce est de passer par une table temporaire, tu ne fais plus de delete mais que des truncate/insert en mode direct.
    Sinon le mieux est de partitionner les tables et de tronquer les partitions, mais ça se pense avant la création des tables.

  6. #6
    Membre expérimenté Avatar de ojo77
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2010
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 680
    Points : 1 597
    Points
    1 597
    Par défaut
    Le temps de réponse sur un effacement dépend de pas mal de paramètres mais le principal est l'indexation :

    admettons que la requête de suppression soit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    delete from table where col1 like '%t%' ;
    Si il y a des index sur la table, TOUS les index doivent être mis à jour.

    Si cela vous est possible, la méthode préconisée par doc malkovich est plus rapide dès lors que vous touchez plus de 15% des blocs de tables avec votre delete (en mode logging) ou 5% des blocs (en mode direct), j'ai fait des tests pour un client les chiffres ne sortent donc pas d'un chapeau magique .

    L'avantage est que vos données sont retassées (vous évitez le gruyère) et que les index sont équilibrés et leurs statistiques à jour et que le recalcul des stats sur la table sera d'autant plus rapide qu'elle couvre moins de blocs.

  7. #7
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Au fait, on parle d'une taille "géante" d'une "dizaine de milliers d'enregistrements"..
    Pour moi ça c'est une petite table. La reconstruction d'index devrait prendre moins d'une minute.

  8. #8
    Membre régulier Avatar de taha1
    Femme Profil pro
    débutantE ^ ^
    Inscrit en
    Mai 2009
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : débutantE ^ ^

    Informations forums :
    Inscription : Mai 2009
    Messages : 106
    Points : 105
    Points
    105
    Par défaut
    Pardon pour le retard,
    Alors, la table concernée est une table qui subit un purge (total) tous les X jours, les insertions sont journalières, toute fois il y a un purge des données (jugées trop vieilles en se basant sur la date d'entée de ces données en base) ce purge est aussi journalier.
    Je n'ai pas accés au explain plan (faut que je demande l'autorisation mais ça me prendra plus de temps ...)
    je ne peux pas vraiment modifier la structure du schéma : c'est l'appli qui construit la base et les tables lors de son installation.
    le rebuild des index n'est pas possible puisque les instructions DML ne doivent pas être bloquées). j'ai lu ceci http://www.orafaq.com/usenet/comp.da...06/23/1956.htm
    ah oui la base est une base 9i

    - pour l'analyse de l'index, j'ai vu ce script qui utilise la fameuse fonction (qui n'est pas documentée : sys_op_lbid ici http://jonathanlewis.wordpress.com/index-efficiency-3/

    Je n'ai pas utilisé cette fonction avant (enfin sur notre base le résultat ne prend même pas 30 seconde mais la table en question est une table de production et non de test), je ne connait pas le coût de cette fonction ni si elle est bloquante, si quelqu'un de vous l'a utilisé, ceci pourrait m'aider

    et Merci de me lire

  9. #9
    Membre expérimenté

    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
    Points : 1 359
    Points
    1 359
    Par défaut
    Citation Envoyé par taha1 Voir le message
    Pardon pour le retard,
    Alors, la table concernée est une table qui subit un purge (total) tous les X jours, les insertions sont journalières, toute fois il y a un purge des données (jugées trop vieilles en se basant sur la date d'entée de ces données en base) ce purge est aussi journalier.
    Je n'ai pas accés au explain plan (faut que je demande l'autorisation mais ça me prendra plus de temps ...)
    je ne peux pas vraiment modifier la structure du schéma : c'est l'appli qui construit la base et les tables lors de son installation.
    le rebuild des index n'est pas possible puisque les instructions DML ne doivent pas être bloquées). j'ai lu ceci http://www.orafaq.com/usenet/comp.da...06/23/1956.htm
    ah oui la base est une base 9i

    - pour l'analyse de l'index, j'ai vu ce script qui utilise la fameuse fonction (qui n'est pas documentée : sys_op_lbid ici http://jonathanlewis.wordpress.com/index-efficiency-3/

    Je n'ai pas utilisé cette fonction avant (enfin sur notre base le résultat ne prend même pas 30 seconde mais la table en question est une table de production et non de test), je ne connait pas le coût de cette fonction ni si elle est bloquante, si quelqu'un de vous l'a utilisé, ceci pourrait m'aider

    et Merci de me lire
    Bonjour,

    Afin de vous aider un peu dans la compréhension de votre problème, je peux vous dire que la fonction sys_op_lbid donne la répartition des clés par leaf block (number of index key per leaf block). Lorsque vous l'executez sur un de vos index et si vous trouvez, par exemple, que pour accéder à une clé d'index vous devez visiter des centaines de leaf blocks alors votre index est un index candidat à "Coalesce". Le coalesce est une opération qui ressemble très fort à une défragmentation du disque dur d'un PC. Oracle va commencer par visiter les blocks d'index en partant de la gauche vers la droite et essayera de "coalescer" ou unir deux leaf block adjacents en un seul block (si c'est possible) et ainsi de suite. Le résultat c'est que la taille de l'index ne change pas mais la répartition des clés par leaf block devient impecable.

    Pour être plus directe si dans votre situation vous avez un algorithme de purge régulier qui supprime les anciennes données sur la base d'une certaine date(par exemple supprimer tous ce qui est > sysdate +7), alors tous vos index basés sur une séquences doivent subir un coalesce. Non seulement ils doivent subir un coalesce mais cette opération doit être faite régulierement aussi. Tous vos indexes basés sur une date sont aussi candidat à un coalesce. C'est ce qu'on appèlle communément "right hand indexes" des indexes remplit uniquement sur leur droite. Tom kyte les appelle "sweeper indexes"

    L'operation coalesce ne lock pas l'index. Mais attention, dépendant du nombre de block à coalescer cela peut prendre beaucoup de temps.

    La fonction sys_op_lbid pour l'avoir utilisée peut également prendre du temps.

    Maintenant ayant dit cela, je vous conseille d'abord d'être sûr que votre problème de performance vient des indexes.

    Bien à vous

    Mohamed Houri

  10. #10
    Membre régulier Avatar de taha1
    Femme Profil pro
    débutantE ^ ^
    Inscrit en
    Mai 2009
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : débutantE ^ ^

    Informations forums :
    Inscription : Mai 2009
    Messages : 106
    Points : 105
    Points
    105
    Par défaut

    d'accord merci je vais essayer d'analyser ces index pour voir d'où viennent les problème de lenteur .

  11. #11
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par taha1 Voir le message
    Alors, la table concernée est une table qui subit un purge (total) tous les X jours
    Comment est faite la purge totale ?
    Il faut utiliser TRUNCATE (et pas DELETE) pour réinitialiser le High Water Mark.
    Il faut pour ça désactiver les clés étrangères.

  12. #12
    Membre régulier Avatar de taha1
    Femme Profil pro
    débutantE ^ ^
    Inscrit en
    Mai 2009
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : débutantE ^ ^

    Informations forums :
    Inscription : Mai 2009
    Messages : 106
    Points : 105
    Points
    105
    Par défaut
    je ne peux pas le savoir c'est l'appli qui le fait ce purge et donc je ne sais pas si le code utilise un delete ou mieux un truncate ...

Discussions similaires

  1. ordre des INDEX d'une table
    Par saluts92b dans le forum Débuter
    Réponses: 4
    Dernier message: 15/10/2011, 08h04
  2. Réponses: 0
    Dernier message: 08/02/2011, 18h42
  3. Sélection du contenu des indexs d'une table
    Par Skualys dans le forum Oracle
    Réponses: 9
    Dernier message: 25/05/2010, 16h08
  4. Réponses: 1
    Dernier message: 04/05/2008, 23h26

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