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 :

Performance d'un update de plusieurs colonnes en full scan


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 14
    Par défaut Performance d'un update de plusieurs colonnes en full scan
    Bonjour,

    N'arrivant pas à trouver de solutions à mon problème, je finis par venir demander de l'aide car je n'avance plus. J'ai une table sur laquelle je dois mettre à jour plusieurs colonnes. Toutes les lignes doivent être mises à jour. Comme je dois faire un full scan pour mettre à jour chaque colonnes, je mets à jour toutes les colonnes avec un seul update. J'ai donc une requête de ce type là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    update matable set
    col1 = case ... when ... else ... end,
    col2 = case ... when ... else ... end,
    col3 = case ... when ... else ... end,
    col4 = case ... when ... else ... end;
    Sur Oracle 10g, cet update mettait juste deux fois plus de temps que la mise à jour d'une colonne, 1h00 on va dire.

    Depuis le passage à Oracle 11g, la mise à jour met à peut près 15h alors que la mise à jour d'une colonne met toujours 0h30. Il devient en fait plus rentable de mettre à jour toutes les colonnes séparément.

    Je me demandais donc ce qui pouvait cause ce problème de performances ou si vous aviez des pistes de recherche.

    Pour ce que ca vaut, le plan d'exécution est le même que je mette à jour une ou toutes les colonnes.

    Merci d'avance!!

  2. #2
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Difficile à dire ce qui ne va pas avec seulement ces informations. Un petit exemple sera bien venu.
    Il est plus performant de récréer une table que de mettre à jour tous ces lignes.

  3. #3
    Membre Expert 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 : 51
    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
    Par défaut
    Je rejoins Mnitu, l'expérimentation montre qu'à partir de 5 % des blocs modifiés (en mode direct) ou 15 % (avec logging contraint) il est plus intéressant de recréer un table dans laquelle les données sont à jour et de l'échanger ensuite avec l'originale.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 14
    Par défaut
    Je mets à jour 25 colonnes sur 260, de tout type (des objets géométriques, des varchars, des integer). Cependant, les colonnes ne sont pas remplies avant la mise à jour et sont toutes à null car je viens de les créer. Je ne peux pas les remplir avant malheureusement.

    J'aimerai mettre un exemple mais la requête est trop important et trop lié au projet pour la modifier simplement.

    Je vais tester la création d'une autre table. Merci, je compléterai si ca ne marche toujours pas.

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 454
    Par défaut
    Vous n'avez pas un problème de PCTUSED / PCTFREE sur votre tablespace en 11g ?

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 14
    Par défaut
    Possible, je ne connais pas ces paramètres. Je me renseigne mais si je comprends leur signification, je ne vois pas comment les consulter.

    edit: Sous oracle 11g pour cette table j'ai ceci:
    PCT_FREE 10
    PCT_USED null

    Pareil sous oracle 10g

  7. #7
    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
    Citation Envoyé par Gnatit Voir le message
    Bonjour,

    Depuis le passage à Oracle 11g, la mise à jour met à peut près 15h alors que la mise à jour d'une colonne met toujours 0h30. Merci d'avance!!
    Bonjour,

    Comme cela a déjà été signalé, il est difficile de se faire une idée quant aux causes ayant entrainé cette lenteur manifeste de votre update suite à votre migration de base de données de 10g vers 11g. Mais quelqu'ait été la methode utilisée pour faire cette migration, beaucoup de choses auquelles vous ne vous attendiez pas peuvent surgir à la fin de cette migration. Vous ne parlez pas des indexes qui existent sur cette table? ont-ils changé de définition? les données (clustering factor) ont-elles été eparpillées lors de cette migration? pas de where clause dans cet update, quelle type de table, etc... Vous ne "postez" pas aussi l'explain plan suivi par cet update.

    Néamoins, avez vous vérifié, les nouvelles valeurs des paramètes de l'optimisateur qui sont par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      (a) db_file_multiblock_read_count
      (b) optimizer_index_cost_adj
      (c) optimizer_index_caching
    en 11g par rapport à ce que vous aviez en 10g?

    Avez-vous tentez de faire votre update en utilisant le hint
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       /*+ optimizer_features_enable('10.2.0.4') */
    10.2.0.4 doit correspondre à la base que vous aviez avant la migration

    Bien cordialement

    Mohamed Houri

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 14
    Par défaut
    Si il y a eu des problèmes lors de la migration (il y en a eu), ils ne devraient pas avoir d'effets sur cette table car elle est recréée toutes les semaines et donc a été créée sous oracle 11g.

    Les paramètres que vous citez sont les mêmes sous oracle 10g et 11g, respectivement 16, 100 et 0.

    Je ne connaissais pas ce hint, je vais essayer. J'aurais d'ailleurs du préciser que j'utilise deux hints pour l'update: /*+ FULL(matable) PARALLEL(matable, DEFAULT) */

    Merci beaucoup pour ces réponses.

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 14
    Par défaut
    Pour information, en créant une nouvelle table copie de la première mais en mettant à jour les colonnes, je suis passé de 15h à 12 minutes. Je ne pensais pas qu'Oracle s'empêtrait autant avec les updates

  10. #10
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Faites une trace étendue de votre requête en 11g pour apprendre ce qui se passe.

  11. #11
    Membre Expert 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 : 51
    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
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Faites une trace étendue de votre requête en 11g pour apprendre ce qui se passe.
    Oracle met à jour l(es) index à chaque foi qu'une ligne est mise à jour sauf dans le cas où l'update utilise un filtre sur une colonne indexée et qu'il utilise l'index.

  12. #12
    Membre très actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    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
    Par défaut
    Bonjour,

    Quelle est la volumétrie de la table concernée ?
    Cette dernière était de combien avant migration ?

    Ce temps de 15 h est il systématique ?

    y a-t-il des traitements en parallèle de votre Update (transactions / batch ) ? présence de Locks ?

    cordialement.

Discussions similaires

  1. probleme de mise a jour update de plusieur colonnes
    Par perrotta dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 15/12/2009, 11h16
  2. UPDATE sur plusieurs colonnes à la fois
    Par yuukuari dans le forum Requêtes
    Réponses: 8
    Dernier message: 18/11/2009, 14h46
  3. Performance d'un update sur une colonne
    Par melendil dans le forum DB2
    Réponses: 2
    Dernier message: 31/03/2009, 14h41
  4. Requete update plusieurs colonnes sql paradox
    Par vitch8 dans le forum Paradox
    Réponses: 1
    Dernier message: 06/03/2009, 17h35
  5. Update de plusieur colonne d'une meme table
    Par Poisson59 dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 28/09/2006, 09h25

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