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 :

Lenteur alter table drop colonne


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 Lenteur alter table drop colonne
    Bonjour,

    Nous avons un script de retour arrière qui supprime 5 nouvelles colonnes sur notre table partitionnée dont une sur laquelle porte un index bitmap.
    Sur notre serveur de développement cela prend 1h10 environ.
    Sur le serveur de recette de notre client, au bout de 10 heures environ, cette suppression des colonnes n'est toujours pas terminée et s'arrête suite à l'arrêt quotidien de la base de données.

    Le volume de données est plus important sur la base de notre client (à la louche le double)
    Est-ce que cela pourrait expliquer la différence de temps de réponse ?
    Agrandir les tablespaces tempo et/ou undo peut-il améliorer les performances ?
    Quelles solutions peuvent-elles être apportées pour améliorer les temps de réponses ?

  2. #2
    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 regal Voir le message
    Bonjour,

    Nous avons un script de retour arrière qui supprime 5 nouvelles colonnes sur notre table partitionnée dont une sur laquelle porte un index bitmap.
    Sur notre serveur de développement cela prend 1h10 environ.
    Sur le serveur de recette de notre client, au bout de 10 heures environ, cette suppression des colonnes n'est toujours pas terminée et s'arrête suite à l'arrêt quotidien de la base de données.

    Le volume de données est plus important sur la base de notre client (à la louche le double)
    Est-ce que cela pourrait expliquer la différence de temps de réponse ?
    Une suppression d'une colonne est-elle plus rapide qu'une suppression des cinq colonnes en parallèle ?
    Agrandir les tablespaces tempo et/ou undo peut-il améliorer les performances ?
    Supprimer une colonne d’une table n’est pas une chose à prendre à la légère. De plus, si votre intention de supprimer une colonne d’une table est dictée par le désir de gagner de l’espace, cette suppression doit être alors inévitablement suivie d’une réorganisation de la table.

    Je pense, comme vous avez des tables partitionnées, qu'une solution à envisager serait de faire ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    mhouri.world> desc RANG_PART_TAB
     Name                                      Null?    Type
     ----------------------------------------- -------- ----------------------------
     ID                                        NOT NULL NUMBER
     MUSE_DATE                                 NOT NULL DATE
     NAME                                               VARCHAR2(10)
     
    mhouri.world> alter table RANG_PART_TAB set unused column name;
     
    Table altered.
     
    mhouri.world> select * from user_unused_col_tabs;
     
    TABLE_NAME                          COUNT                                       
    ------------------------------ ----------                                       
    RANG_PART_TAB                           1                                       
     
    mhouri.world> alter table RANG_PART_TAB move partition p1;
     
    Table altered.
     
    mhouri.world> alter table RANG_PART_TAB move partition p2;
     
    Table altered.
     
    mhouri.world> alter index ind_1 rebuild partition p1;
    Et vous pouvez faire cela en parallèle partition par partition

    Sinon, vous avez aussi l'option de créer une vue sur votre table qui exclue cette colonne (mais je pense que cela ne vous convient pas)
    Bien Respectueusement
    www.hourim.wordpress.com

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

  3. #3
    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 : 49
    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
    comme toujours, un problème, plusieurs solutions.

    De mon coté je recréerait un table avec un "create table as select" pour je recréerait les index sur cette nouvelle table pour enfin faire un "rename" de la table obtenue au final. Ça implique une indisponibilité en écriture le temps de l'opération et ça consomme somme toute de l'espace mais la table créée n'est pas fractionnée et les index sont équilibrés (surtout si vous utilisez des bitmaps index qui supportent très mal les mises à jour).

  4. #4
    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 testé la suppression d'une seule colonne, c'est aussi lent que plusieurs.
    J'ai testé une désactivation des index, suite à une suggestion de notre client, cela ne modifie pas le temps de réponse du drop.
    Ce drop de colonne est effectué dans une procédure de retour arrière dont le but est de remettre la table de la base dans son état antérieur à l'installation d'une évolution, uniquement si cette installation provoque une erreur (ce qui a été malheureusement le cas pour nous, voir http://www.developpez.net/forums/d11...ild-partition/)
    Un ordre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alter table ... set unused column
    ne supprime pas la colonne. Bien entendu il serait possible ensuite de retester le script d'installation mais nous préférerions remettre la base dans son état initial (et récupérer l'espace disque).
    Il semble que le move des partitions ne change rien au statut de la colonne unused qui n'est pas droppé et nécessiterait donc un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alter table ... drop unused columns

  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
    Il n'est pas possible de recréer la table avec un "create as select ..." nous n'avons pas l'espace - et j'ai bien peur que le temps de réponse soit encore plus long.
    Reconstruire l'ensemble des index (via rebuild partition) nécessite nettement plus de temps (sur notre base de développement) que la suppression des colonnes.
    Pour information nous avons 157 partitions dans la base de notre client (1 par mois depuis janvier 1999).
    Et ces partitions contiennent en moyenne 8 à 9 millions de lignes entre 2000 et mi 2008 (un peu moins pour fin 1999 et 2000, peu pour début 1999 et depuis mai 2008).
    Nous avons analysé les temps de réponses via la vue v_$session_longops
    Pour traiter le même nombre de bloc (les partitions jusque mi 2005 sont identiques sur nos bases, notre base de développement étant une copie de leur base effectuée à cette date), le temps de réponse est environ 6 fois plus long sur leur serveur.
    Le serveur est mutualisé. Le fait que d'autre traitements tournent en parallèle pourrait peut-être expliquer la différence de performance.
    Peut-on jouer sur des paramètres Oracle pour améliorer le temps de traitement ?

Discussions similaires

  1. ALTER TABLE DROP UNIQUE INDEX
    Par Tonii dans le forum SQL
    Réponses: 9
    Dernier message: 04/06/2010, 17h01
  2. Problème sur ALTER TABLE ADD (colonne)
    Par gafa5265 dans le forum Langage SQL
    Réponses: 12
    Dernier message: 11/03/2009, 22h32
  3. alter table : drop column
    Par delas dans le forum DB2
    Réponses: 1
    Dernier message: 26/06/2006, 13h42
  4. [9i] syntaxe de ALTER TABLE ... DROP PARTITION
    Par dyvim dans le forum Oracle
    Réponses: 1
    Dernier message: 03/02/2006, 11h52

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