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

Langage SQL Discussion :

Performances et clause conditionnelle


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2003
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 42
    Par défaut Performances et clause conditionnelle
    Bonjour,

    J'ai 2 tables de départ :
    - TEMP_VOIE avec 2 000 000 d'enregistrements
    - TEMP_NUMERO avec 20 000 000 d'enregistrements
    (je suis sous postgres 7.3)

    je veux migrer ces données dans un table DESTINATION en effectuant les traitements suivants :

    pour chaque ligne TEMP_VOIE, il me faut récupere le :
    - min des numeros impairs
    - max des numeros impairs
    - min des numeros pairs
    - max des numeros pairs

    quelle solution est la plus rapide ?

    SOLUTION 1 :

    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
     
    insert into DESTINATION (CLE, LIBELLE, MIN_IMP, MAX_IMP, MIN_P, MAX_P)
    select distinct CLE, LIBELLE,
    (
      select  min(a.numero) from TEMP_NUMERO  a where a.CLE = t.CLE
      and a.numero > 0 and a.numero % 2 = 1
      group by a.matricule
    ),
    (
      select  max(a.numero) from TEMP_NUMERO  a where a.CLE = t.CLE
      and a.numero > 0 and a.numero % 2 = 1
      group by a.matricule
    ),
    (
      select  min(a.numero) from TEMP_NUMERO  a where a.CLE = t.CLE
      and a.numero > 0 and a.numero % 2 = 0
      group by a.matricule
    ),
    (
      select  max(a.numero) from TEMP_NUMERO  a where a.CLE = t.CLE
      and a.numero > 0 and a.numero % 2 = 0
      group by a.matricule
    )
    from TEMP_VOIE t
    Je suis oblige de faire 4 sous requetes ...


    SOLUTION 2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    insert into DESTINATION (CLE, LIBELLE, MIN_IMP, MAX_IMP, MIN_P, MAX_P)
    select distinct CLE, LIBELLE, min(a.num), max(a.num), 
    min(b.num), max(b.num)
    from TEMP_VOIE t, TEMP_NUMERO a, TEMP_NUMERO b
    and a.CLE = t.cle and a.num >0 and a.num % 2 = 1
    and b.CLE = t.cle and b.num >0 and b.num % 2 = 0
    group by t.CLE, t.LIBELLE
    Je crois que cette solution ne fonctionne pas du fait qu'aucune ligne ne serait au final regroupe, les 2 modulos etant concurrents ?!

    Confirmez vous cela ?

    J'ai besoin d'avoir les 4 valeurs simultannemets, il y a t-il une autre solution ?
    .. avec des CASE ?! je n'arrive pas a les utiliser ...

    SOLUTION 3

    Le faire en 3 etape :
    - je fais un uptade de TEMP_VOIE avec les numeros pairs
    - je fais un uptade de TEMP_VOIE avec les numeros impairs
    - au final j'insere le tout !!

    Que me conseiller vous ?

    Merci d'avance.

  2. #2
    Rédactrice

    Avatar de Fleur-Anne.Blain
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2 636
    Par défaut
    Bonjour,

    synthaxe du case:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT CHB_NUMERO, CASE CHB_ETAGE
                          WHEN 'RDC' THEN 0 
                          WHEN '1er' THEN 1
                          WHEN '2e'  THEN 2
                       END AS ETAGE, CHB_COUCHAGE
    FROM   T_CHAMBRE
    ORDER  BY  ETAGE, CHB_COUCHAGE
    voir tutoriels!!!! http://sqlpro.developpez.com/cours/sqlaz/select/#L7.1

    Il me semble que ta solution 1 est la meilleure et la plus performante. A voir peut-être avec le case si tu veux.

    @+
    la culture c'est comme la confiture moins on en a plus on l'étale.

    Mes tutos

Discussions similaires

  1. [10gR2] Problème étrange de performances avec clause "ORDER BY"
    Par StringBuilder dans le forum SQL
    Réponses: 4
    Dernier message: 04/06/2014, 15h26
  2. Performance et clause WHERE.. IN (SELECT ..).
    Par WinNew dans le forum Requêtes
    Réponses: 6
    Dernier message: 13/09/2010, 21h50
  3. Affectation d'égalité et clause conditionnelle
    Par forward11 dans le forum Langage
    Réponses: 1
    Dernier message: 11/11/2007, 09h08
  4. structure conditionnelle dans la clause where
    Par liberty74 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 01/06/2007, 00h18
  5. performance clause like / starting with
    Par KRis dans le forum SQL
    Réponses: 2
    Dernier message: 20/01/2006, 15h42

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