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

PL/SQL Oracle Discussion :

Optimisation UPDATE (too long)


Sujet :

PL/SQL Oracle

  1. #1
    Membre régulier
    Homme Profil pro
    Consultant Décisionnel
    Inscrit en
    Janvier 2012
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant Décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2012
    Messages : 128
    Points : 84
    Points
    84
    Par défaut Optimisation UPDATE (too long)
    Bonjour à tous,

    Je rencontre quelques soucis avec un UPDATE. 500.000 lignes env (ce qui n'est pas énorme)


    Pour l'instant ce que je fait :
    - Création d'un table tmp (physique) avec uniquement la données qui m’intéresse + Les colonnes de la jointure utile à l'update.
    - Les index sont créés sur les deux tables.


    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
     
            INSERT INTO A  (s2cgr, cgr_cod, chm, chmaa, ets)
            SELECT s2cgr, cgr_cod, chm, chmaa, ets
          	FROM  Source,
                  B
            WHERE Source.cgr_cod = B.cgr_cod
    					  AND Source.ets = B.ets
    					  AND Source.chmaa = B.chmaa
    					  AND Source.chm = B.chm
                AND B.chm = 'ST15'; 
            COMMIT;
     
     
            UPDATE B
    				SET B.unite = (SELECT DISTINCT  s2cgr	 
    				                       FROM A CCGR 
                                                           WHERE A.cgr_cod = B.cgr_cod
                                                           AND A.ets = B.ets
                                                           AND A.chmaa = B.chmaa
                                                            AND A.chm = B.chm)
    				WHERE B.chm = 'ST15' 
            AND EXISTS
                                      ( SELECT 1 FROM A CCGR 
                                       WHERE A.cgr_cod = B.cgr_cod
                                        AND A.ets = B.ets
                                        AND A.chmaa = B.chmaa
                                        AND A.chm = B.chm)
    Vous avez une idée ?

    Bonne soirée.

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 129
    Points : 38 521
    Points
    38 521
    Billets dans le blog
    9
    Par défaut
    Avez vous fait un explain ?

    Communiquez le ddl de vos index et la volumétrie des tables

  3. #3
    Membre régulier
    Homme Profil pro
    Consultant Décisionnel
    Inscrit en
    Janvier 2012
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant Décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2012
    Messages : 128
    Points : 84
    Points
    84
    Par défaut
    Dans A : 350669 lignes 5 col.


    Dans B : 350675 lignes 19 col avec le where (WHERE inf_obbud_iac.chm = 'ST15')

    Sinon la volumétrie globale est de 11.322.116 lignes..

    Je ne peux pas faire de delta pour l'instant..

    Pour les Index j'ai créé un index sur chaque table comprenant les colonnes de la jointure.
    Et celle du where "chm"
    • cgr_cod
    • ets
    • chmaa
    • chm


    Ps : je ne sais pas ce qu'est une ddl pour les Index?

    Et l'explain je vais essayer de le faire là.

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 129
    Points : 38 521
    Points
    38 521
    Billets dans le blog
    9
    Par défaut
    Le DDL (Data Definition Language) c'est l'ensemble du code servant à créer, modifier, supprimer les objets de la base de données (CREATE, ALTER, DROP, BIND etc...) et à attribuer des droits (GRANT, REVOKE...)
    Il faut donc communiquer le DDL des ordres CREATE INDEX
    Et si possible le nombre de valeurs distinctes des colonnes de ces index


    Citation Envoyé par BIOoOAG Voir le message
    Dans B : 350675 lignes 19 col avec le where (WHERE inf_obbud_iac.chm = 'ST15')
    Un index aussi peu filtrant n'est probablement pas utilisé

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Essayez avec un MERGE à la place de l'UPDATE.
    Par ailleurs je ne vois pas bien l'intérêt de la table A mais peut être que ça dépend de la volumétrie de la table source.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    merge into B
    using source s
       on (    s.cgr_cod = B.cgr_cod
           AND s.ets     = B.ets
           AND s.chmaa   = B.chmaa
           AND s.chm     = B.chm
           and s.chm     = 'ST15')
     when matched then
      set B.unite = s.s2cgr

  6. #6
    Membre régulier
    Homme Profil pro
    Consultant Décisionnel
    Inscrit en
    Janvier 2012
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant Décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2012
    Messages : 128
    Points : 84
    Points
    84
    Par défaut
    Ah!

    Le merge met 3 min alors que l'update met 1h!

    Commenct fonctionne le merge pour être aussi rapide?

    Ca ne mange pas truc de mémoire et de perf le merge?

    Merci en tout cas!

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

Discussions similaires

  1. colonne de type TEXT et pourtant error, data too long
    Par boss_gama dans le forum Installation
    Réponses: 5
    Dernier message: 17/04/2007, 14h17
  2. Erreur Data too long For column
    Par fabrice.77 dans le forum Débuter
    Réponses: 12
    Dernier message: 12/02/2007, 09h19
  3. [NWNX ODBC2 plugin] Data too long for column ..
    Par ballestolive dans le forum Débuter
    Réponses: 1
    Dernier message: 31/10/2006, 15h01
  4. ERROR 1406 (22001): Data too long for column
    Par olive_le_malin dans le forum Requêtes
    Réponses: 6
    Dernier message: 12/06/2006, 14h27
  5. "Data truncation: Data too long for column"
    Par bibiloute dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 04/05/2006, 09h08

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