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 :

UPDATE avec clause à NULL => Comment ne pas dégrader performance ?


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2004
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 45
    Points : 49
    Points
    49
    Par défaut UPDATE avec clause à NULL => Comment ne pas dégrader performance ?
    Bonjour,

    J'aimerais savoir s'il y a un moyen de ne pas plomber les performances lorsque qu'on fait un update où certaines clauses du WHERE sont à NULL.

    Je m'explique :

    Ce premier est update est très rapide mais si une des colonnes est a null (et donc sa valeur recc* également) la ligne n'est pas mise à jour :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    update TMEEVP                                        
    set numseq = recc0                                   
    where business_unit = recc1                          
    and datsitu = recc2                                  
    and prdet=recc3                  
    and prifi=recc4                  
    and foreign_currency = recc5     
    and prcsv=recc6                  
    and prmat=recc7                  
    and prdvn=recc8                  
    and prflx = recc9                
    and prsem= recc10                
    and paemt = recc11;
    Pour info, Les valeurs recc* sont retournées par un curseur

    Alors que celui met à jour l'exhaustivité des lignes mais avec des performances très dégradées (business_unit et datsitu ne peuvent etre null):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    update TMEEVP                                       
    set numseq = recc0                              
    where business_unit = recc1                     
    and datsitu = recc2                             
    and nvl(prdet, 'A')=nvl(recc3, 'A')             
    and nvl(prifi, 'A')=nvl(recc4, 'A')             
    and nvl(foreign_currency, 'A') = nvl(recc5, 'A')
    and nvl(prcsv, 'A')=nvl(recc6, 'A')             
    and nvl(prmat, 'A')=nvl(recc7, 'A')             
    and nvl(prdvn, 'A')=nvl(recc8, 'A')             
    and nvl(prflx, 'A') = nvl(recc9, 'A')           
    and nvl(prsem, 'A')= nvl(recc10, 'A')           
    and nvl(paemt, 'A') = nvl(recc11, 'A');
    Connaissez-vous une solution à ce problème ?

    D'avance merci

  2. #2
    Membre habitué Avatar de Loyd1974
    Profil pro
    Inscrit en
    Août 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 176
    Points : 196
    Points
    196
    Par défaut
    Tu peux passer par du sql dynamique, et tu testes chacune de tes colonnes pour construire ta clause where, cela fera un truc du style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Sql_Stmt = 'UPDATE TABLE SET Col = ' ||  Parm1 || ' WHERE 1=1 ';
    if Parm2 is not null then
       sql_stmt = sql_Stmt || ' AND Col2 = ' || Parm2;
    end if;
    If Parm3 is not null then
       sql_stmt = sql_Stmt || ' AND Col3 = ' || Parm3;
    end if;
    ...
    execute immediate sql_stmt;

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2004
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 45
    Points : 49
    Points
    49
    Par défaut
    Humpf....

    Je peux mettre du SQL dynamique dans un bloc PL/SQL ?

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Cofondinde Voir le message
    Je peux mettre du SQL dynamique dans un bloc PL/SQL ?
    OUI !!!
    http://sheikyerbouti.developpez.com/execute_immediate/

  5. #5
    Membre du Club
    Inscrit en
    Décembre 2004
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 45
    Points : 49
    Points
    49
    Par défaut
    Oki, je teste. Reponse lundi

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 207
    Points : 237
    Points
    237
    Par défaut
    Bonsoir,

    Pourquoi ne pas prévoir d'excluse les lignes non updatable dans le curseur ?
    Autre solution, utiliser des index de type fonction ex (create index idx on matable(nvl(col1,'A'));

  7. #7
    Membre averti Avatar de LBO72
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 342
    Points
    342
    Par défaut
    Tu peux éliminer les lignes non condidates à l'UPDATE dans ton curseur, non ? ...

  8. #8
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    Pour moi, cette requête a de forte chances d'être le symptome d'un mauvais schéma et/ou d'une application mal conçue...

    Idéalement, on devrait utiliser une clé primaire, non ?

Discussions similaires

  1. [PDO] Requete UPDATE avec PDO fonctionnelle en local mais pas sur OVH
    Par olinet dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 05/12/2014, 14h57
  2. Update avec Select : je n'y arrive pas.
    Par marye77 dans le forum Langage SQL
    Réponses: 15
    Dernier message: 22/02/2008, 16h51
  3. [SQL] Comment ne pas exécuter une clause WHERE si une var est nulle
    Par charlysquare dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 01/05/2006, 21h12
  4. [PostGreSLQ] pb d'UPDATE avec valeur NULL
    Par mellie dans le forum Langage SQL
    Réponses: 3
    Dernier message: 06/03/2006, 10h03
  5. Réponses: 10
    Dernier message: 30/11/2004, 10h12

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