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

Oracle Discussion :

[SQL] performances Decode ou Case when ?


Sujet :

Oracle

  1. #1
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut [SQL] performances Decode ou Case when ?
    Bonjour,
    je me demande, pour une requête semblable, si il y a une différence de performances entre l'utilisation de la syntaxe "Decode" ou de la syntaxe "Case When"...

    des idées ?
    Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

    Yorglaa

  2. #2
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    D'abord, il faut bien voir que le CASE est bien plus puissant que le DECODE donc, il faut comparer ce qui est comparable à savoir la seul fonction de retourner une valeur selon la valeur d'une colonne (ou variable)

    dans ce cas dans la 9i c'est pareil mais en 8i le CASE peut être moins performant.

    http://asktom.oracle.com/pls/ask/f?p=4950:8:16367464451358143734::NO::F4950_P8_DISPLAYID,F4950_P8_CRITERIA:1243867216406,

    Comme le dit ce cher Tom Kyte, le CASE est surtout beaucoup plus facile à lire et donc à maintenir

  3. #3
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    ok merci...
    dans mon cas (9.2.0.5) c'est quelque chose comme (une colonne du Select)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Case when A = B
            then
                    (Select C From...)
            Else
                    D
            End as maColonne
    donc ma question porte surtout sur le sous-select imbriqué dans la clause THEN... est-ce qu'il va être interprété la même chose et au même moment si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Decode (
                   A 
                , 
                   B
                ,
                    (Select C From...)
                ,
                    D
                ) as maColonne
    Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

    Yorglaa

  4. #4
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    A mon avis, il y a bien plus performant à faire, je pense que si tu sors la table et les clauses de la sous-requête pour les mettre dans ta requête principale ça sera bcp mieux...

    Par ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT (Case when A = B 
            then 
                    (Select C From tab2 WHERE ...) 
            Else 
                    D 
            End) as maColonne
    FROM tab1
    pourrait être :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT (Case when A = B 
            then 
                   tab2.C
            Else 
                    D 
            End) as maColonne
    FROM tab1,tab2
    WHERE...
    Enfin, faudrait voir sur un exemple mais je pense que ça doit être jouable

  5. #5
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    c'est pas évident, le sous select qui est dans le case est lui-même composé de 6 sous select...
    Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

    Yorglaa

  6. #6
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    bah là, j'peux dire sans trop de doute que ça sera très probablement anti-perf

    Même si la requête est complexe, il faut absolument éviter les sous-requêtes de sous-requête de sous... etc...

  7. #7
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    oui je sais, mais là j'ai pas eu le choix...

    j'ai essaye de mettre les conditions qui provoque mon Case When dans le where et de régler ça avec des jointures, mais dans ce cas je me trouve avec un haut niveau de récursivité dans le Select, c'est à dire qu'il doit "se tester sur lui-même" en permanence avant de décider quoi me retourner...

    => en bref avec les jointures j'ai plus de 40 minutes de traitement et avec le Case j'arrive à 16 minutes...
    Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

    Yorglaa

  8. #8
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Bon, je connais pas la requête et je veux bien croire que les sous-requêtes soit performantes , mais pour répondre à la question... le DECODE n'y changera rien

  9. #9
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    Citation Envoyé par orafrance
    mais pour répondre à la question... le DECODE n'y changera rien
    merci pour l'info...
    Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

    Yorglaa

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

Discussions similaires

  1. [SQL Server 2000] Equivalent CASE WHEN
    Par Piolet dans le forum Développement
    Réponses: 4
    Dernier message: 25/03/2009, 16h40
  2. SQL Case When
    Par mechatikhaled dans le forum Bases de données
    Réponses: 5
    Dernier message: 18/01/2009, 16h57
  3. Sql CASE/WHEN avec HyperFile
    Par iniaina dans le forum HyperFileSQL
    Réponses: 5
    Dernier message: 21/11/2008, 10h37
  4. Transact SQL : case when
    Par dianouch dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 21/07/2006, 12h12

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