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

SQL Oracle Discussion :

ORA-01654 Delete puis insert table avec index bitmap [9i]


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 25
    Points : 15
    Points
    15
    Par défaut ORA-01654 Delete puis insert table avec index bitmap
    Bonjour,

    Nous avons dans notre base une table sur laquelle ont été définis des index bitmap. Jusque ce jour la mise à jour de cette table se fait 2 fois par mois : une fois par un calcul provisoire qui insère des données, une seconde par un calcul définitif consistant à supprimer les données provisoire du mois correspondant puis à les recalculer. Ce fonctionnement ne pose pas de problème.
    Nous mettons en place un mécanisme de purge basé sur un critère de date. Cette purge au premier lancement, supprime les données sur plusieurs années. Une fois la purge jouée dans l'environnement de recette, la procédure de suppression puis ré-insertion de données s'est traduite par une erreur :
    ORA-01654 : impossible d'étendre l'index ... dans le tablespace ...
    Afin de libérer de la place nous avons reconstruit l'ensemble des index bitmap par la commande
    alter index ... rebuild.
    L'espace libre passe alors de 2,6% à 73%.
    Hélas, la relance de l'insertion provoque à nouveau la même erreur ORA-01654.
    Sur notre serveur de développement nous observons le même comportement : l'insertion entraine un accroissement exponentiel des index bitmap (avec ou non l'erreur ORA-01654 selon le mois de données choisi).

    Pourquoi une opération d'insertion de données qui fonctionnait avant la purge massive et/ou le rebuild ne fonctionnerait plus ensuite ?

    Quelles solutions pouvons-nous mettre en place ?

  2. #2
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Points : 263
    Points
    263
    Par défaut
    Bonjour,

    Les index et tables sont sur les mêmes tablespaces ?

    Sinon, je pense que ton problème porte un nom : high water mark

    mais je me trompe peut être, à faire confirmer.

    Cordialement. GM.
    Cordialement.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 25
    Points : 15
    Points
    15
    Par défaut
    Les index et les tables sont dans des tablespaces distincts.

  4. #4
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Points : 263
    Points
    263
    Par défaut
    ce topic peut t'aider je pense :

    par ici

    cordialement, GM
    Cordialement.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 25
    Points : 15
    Points
    15
    Par défaut
    J'ai supprimé puis reconstruit les index bitmap et j'ai toujours le même problème.
    Pour info :
    notre procédure insère les nouveaux enregistrements ligne par ligne (et effectue aussi des update sur ceux-ci).
    Un test d'insertion en bloc à partir d'une table de sauvegarde
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into table1 select * from table2 where condition
    ne provoque pas d'extension abusive des index bitmap. La condition porte sur les données d'un mois de façon à avoir un volume de données du même ordre de grandeur que celui inséré par la procédure de calcul.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 25
    Points : 15
    Points
    15
    Par défaut
    Suite à mes tests quelques informations supplémentaires :
    j'ai effectué dans notre environnement de développement un truncate de la table puis ré-inséré des données en jouant en boucle la procédure de calcul qui alimente la table : aucun problème de saturation. J'ai effectué différentes purges suivies de calcul et n'observe qu'une très légére augmentation de la taille des index.
    J'ai alors effectué un rebuild de l'index : suite à ce rebuild une insertion ligne par ligne par la procédure est très ralentie par rapport à la même insertion avant rebuild et la taille des index croit exponentiellement.

    On observe donc qu'un rebuild d'index au lieu d'améliorer le comportement le dégrade complétement.

  7. #7
    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

    On observe donc qu'un rebuild d'index au lieu d'améliorer le comportement le dégrade complétement.
    Un rebuild d'un index recalcule les statistiques automatiquement. Il fallait peut-être enregistrer les stats avant rebuild et les remettre après le rebuild pour voir si vous retrouvez votre temps d'insertion d'avant rebuild.
    Bien Respectueusement
    www.hourim.wordpress.com

    "Ce qui se conçoit bien s'énonce clairement"

  8. #8
    Membre expert

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2012
    Messages
    612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2012
    Messages : 612
    Points : 3 066
    Points
    3 066
    Par défaut
    Citation Envoyé par Mohamed.Houri Voir le message
    Un rebuild d'un index recalcule les statistiques automatiquement.
    J'ignorais ça, merci pour l'info

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 25
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par Mohamed.Houri Voir le message
    Un rebuild d'un index recalcule les statistiques automatiquement.
    J'observe un comportement légèrement différent si je met ou non l'option compute statistics à la commande rebuild.
    Avec l'option compute statistics la taille des index augmente moins vite lors de la réinsertion de données (j'obtient le message ORA-01654 après 3 lancement de la procédure d'alimentation de la table au lieu d'un seul)
    Pour info, chaque lancement de la procédure insère un nombre équivalent de lignes (mais pour un mois différent).

  10. #10
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Je cite ici Tom Kyte :
    Bitmaps in fact do update rather quickly. However, they also tend to SERIALIZE and do not respond well to slow by slow (row by row) updates. They are suitable for read only/read mostly data that is modified in BULK (not row by row)
    Si vous avez des procédures qui font du ligne à ligne "massif", il faudrait envisager :
    - de passer à une gestion ensembliste Bulk
    - ou sinon de dropper les index bitmaps au début de la procédure et de les re-créer à la fin.

    Le tout nécessitant des mesures pour s'assurer que l'effet produit est bien le bon.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 25
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par Rei Ichido Voir le message
    Si vous avez des procédures qui font du ligne à ligne "massif", il faudrait envisager :
    - de passer à une gestion ensembliste Bulk
    - ou sinon de dropper les index bitmaps au début de la procédure et de les re-créer à la fin.

    Le tout nécessitant des mesures pour s'assurer que l'effet produit est bien le bon.
    Une gestion Bulk ne semble pas adapté à la procédure de calcul qui alimente notre table.
    Nous avions proposé à notre client de dropper les index au début de la procédure et de les re-créer à la fin. Notre client ne tient pas à modifier la procédure de calcul même à la marge.
    Nous avons contourné le problème en remplaçant les index bitmap par des index b-tree sans constater pour le moment de dégradation notable dans les vitesse d'exécution des requêtes de sélection dans la table.

  12. #12
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    C'est plutôt inquiétant sur la pertinence du choix des index bitmaps en premier lieu ...
    À quoi ressemble votre table, et combien de colonnes étaient indexées en bitmap ? Et à quoi ressemblent vos requêtes ?
    Il est intéressant d'avoir des index bitmaps quand on a beaucoup de colonnes avec des facteurs qui, chacun pris séparément, est peu discriminant et avec idéalement peu de valeurs différentes, et qu'on s'attend à ce que toute combinaison de ces colonnes puisse être utilisée en filtre.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 25
    Points : 15
    Points
    15
    Par défaut
    Il y avait 12 index bitmap sur la table.
    Seuls 11 index ont été reconstruit en b-tree, le 12ème correspondait à une colonne qui ne contient désormais plus qu'une seule valeur.
    Effectivement la plupart de ces index contenaient peu de valeurs distinctes.
    Par contre l'essentiel des requêtes de sélection s'appuie en premier sur des critères de dates, les autres colonnes intervenant pour filtrer plus précisément les données.
    Je ne travaillait pas encore sur cette application au moment du choix des index bitmap, je ne sais donc pas avec précision pourquoi ils ont été choisis pour cette table.
    Dans notre application les index bitmap sont aussi utilisés - de façon pertinente - sur la table la plus volumineuse de notre base - la seule a être partitionnée. La purge de cette dernière table se traduisant par la suppression d'une partition (et des partitions d'index correspondante), elle ne pose aucun problème.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. MISE A JOUR de grosses tables avec index
    Par soph35 dans le forum SAS Base
    Réponses: 6
    Dernier message: 26/03/2010, 11h03
  2. manipuler une table avec index
    Par aminfire dans le forum SAS Base
    Réponses: 0
    Dernier message: 03/09/2009, 12h17
  3. probleme de delete sur une table avec somation
    Par galaad666 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 23/10/2006, 16h44
  4. Reconstruction d'une table avec index
    Par Ry_Yo dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 22/04/2005, 09h12
  5. Création de table avec index
    Par Seb7 dans le forum Requêtes
    Réponses: 2
    Dernier message: 10/04/2003, 16h11

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