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 :

Optimisation de requête


Sujet :

SQL Oracle

  1. #1
    Membre du Club Avatar de eikeshi
    Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 73
    Points : 61
    Points
    61
    Par défaut Optimisation de requête
    Bonjour à tous, je travaille sur un projet qui consiste à compter le nombre de ventes par transaction sur une base de données Oracle 9i.
    Je dois compter le nombre de ventes, le nombre de retours, le nombre de tickets de ventes et le nombre de tickets de retours. Voici ma requête :

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    SELECT HC.CODEMAGASIN, HC.CODEVENDEUR,
    (Select count(hc1.typedevente)
    from historique_caisses hc1
    where hc1.codemagasin = HC.CODEMAGASIN
    and hc1.codevendeur = HC.CODEVENDEUR
    and hc1.typedevente = 1
    and hc1.typeligne = 1
    and hc1.codeinternearticle >= 50000
    and hc1.ticketannule = 0
    and hc1.jourdevente like to_date('30/06/2008','DD/MM/YYYY')) AS NBARTICLESVENDUS,
    (Select count(hc2.typedevente)
    from historique_caisses hc2
    where hc2.codemagasin = HC.CODEMAGASIN
    and hc2.codevendeur = HC.CODEVENDEUR
    and hc2.typedevente = 1
    and hc2.typeligne = 2
    and hc2.codeinternearticle >= 50000
    and hc2.ticketannule = 0
    and hc2.jourdevente like to_date('30/06/2008','DD/MM/YYYY')) AS NBARTICLESRETOURNES,
    (select count(distinct hc3.numticket)
    from historique_caisses hc3
    where hc3.codemagasin = hc.codemagasin
    and hc3.codevendeur = hc.codevendeur
    and hc3.typedevente = 1
    and hc3.codeinternearticle >= 50000
    and hc3.typeligne = 1
    and hc3.ticketannule = 0
    and hc3.jourdevente like to_date('30/06/2008','DD/MM/YYYY')) AS NBTICKETSVENTES,
    (select count(distinct hc4.numticket)
    from historique_caisses hc4
    where hc4.codemagasin = hc.codemagasin
    and hc4.codevendeur = hc.codevendeur
    and hc4.typedevente = 1
    and hc4.codeinternearticle >= 50000
    and hc4.typeligne = 2
    and hc4.ticketannule = 0
    and hc4.jourdevente like to_date('30/06/2008','DD/MM/YYYY')) AS NBTICKETSRETOURS
    FROM HISTORIQUE_CAISSES HC
    WHERE HC.CODEMAGASIN >= 33
    AND HC.CODEINTERNEARTICLE >= 50000
    AND HC.TYPELIGNE IN (1,2)
    AND HC.JOURDEVENTE LIKE TO_DATE('30/06/2008','DD/MM/YYYY')
    GROUP BY HC.CODEMAGASIN,HC.CODEVENDEUR
    --------------------------------------------------------------------------
    Cette requête fonctionne mais me paraît un peu trop lourde en traitement.
    Est-ce qu'il y a un moyen d'optimiser cette dernière ?

    Merci pour vos réponses.
    Il y a des jours avec, il y a des jours sans et les jours sans, il faut faire avec.

  2. #2
    Membre expérimenté Avatar de scheu
    Inscrit en
    Juin 2007
    Messages
    1 506
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 1 506
    Points : 1 734
    Points
    1 734
    Par défaut
    T'as lu les tutos sur ce site ?
    Statistiques ? Plan d'exécution ? Quelle volumétrie ? T'as fais un tkprof ?
    La théorie, c'est quand on sait tout mais que rien ne fonctionne.
    La pratique, c'est quand tout fonctionne mais que personne ne sait pourquoi.
    Ici, nous avons réuni théorie et pratique : Rien ne fonctionne ... et personne ne sait pourquoi !

    Réplication de base avec Postgresql : http://scheu.developpez.com/tutoriel.../log-shipping/

  3. #3
    Membre du Club Avatar de eikeshi
    Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 73
    Points : 61
    Points
    61
    Par défaut
    Je ne vois pas en quoi les statistiques, le plan d'exécution, la volumétrie ou encore le tkprof serait utile ?
    Je demande juste si, synthaxiquement parlant, il y a mieux que cette requête répétitive ?
    Il y a des jours avec, il y a des jours sans et les jours sans, il faut faire avec.

  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
    Citation Envoyé par eikeshi Voir le message
    Je demande juste si, synthaxiquement parlant, il y a mieux que cette requête répétitive ?
    Et sans le plan d'exécution pour voir les accès comment tu veux qu'on te le dise ? On ne sait même pas si tu as des indexes sur tes tables

    Tu peux déjà remplacer les LIKE par égal. typeligne n'est pas de type NUMBER ?

  5. #5
    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
    Ca donne quoi ça sinon :
    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
    SELECT HC.CODEMAGASIN, HC.CODEVENDEUR,
     DECODE(stats.typedevente || stats.codevendeur, '11', nb_tdv, 0)  AS NBARTICLESVENDUS,
     DECODE(stats.typedevente || stats.codevendeur, '12', nb_tdv, 0)  AS NBARTICLESRETOURNES,
     DECODE(stats.typedevente || stats.codevendeur, '11', nb_numtick, 0)  AS NBTICKETSVENTES,
     DECODE(stats.typedevente || stats.codevendeur, '12', nb_numtick, 0)  AS NBTICKETSRETOURS
    FROM HISTORIQUE_CAISSES HC, 
    (Select codemagasin,codevendeur,typedevente, typeligne,count(hc1.typedevente) nb_tdv,count(distinct hc3.numticket) nb_numtick
    from historique_caisses hc1
    where hc1.codeinternearticle >= '50000'
    and hc1.ticketannule = '0'
    and hc1.jourdevente = to_date('30/06/2008','DD/MM/YYYY')
    GROUP BY typedevente,typeligne) stats
    WHERE HC.CODEMAGASIN >= '33'
    AND HC.CODEINTERNEARTICLE >= '50000'
    AND HC.TYPELIGNE IN ('1','2')
    AND HC.JOURDEVENTE = TO_DATE('30/06/2008','DD/MM/YYYY')
    AND stats.codemagasin = HC.codemagasin
    AND stats.codevendeur = HC.codevendeur
    GROUP BY HC.CODEMAGASIN,HC.CODEVENDEUR
    Voir :
    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
    SELECT HC.CODEMAGASIN, HC.CODEVENDEUR,
     DECODE(stats.typedevente || stats.codevendeur, '11', nb_tdv, 0)  AS NBARTICLESVENDUS,
     DECODE(stats.typedevente || stats.codevendeur, '12', nb_tdv, 0)  AS NBARTICLESRETOURNES,
     DECODE(stats.typedevente || stats.codevendeur, '11', nb_numtick, 0)  AS NBTICKETSVENTES,
     DECODE(stats.typedevente || stats.codevendeur, '12', nb_numtick, 0)  AS NBTICKETSRETOURS
    FROM HISTORIQUE_CAISSES HC, 
    (Select codemagasin,codevendeur,jourdevente,codeinternearticle,typedevente, typeligne,count(hc1.typedevente) nb_tdv,count(distinct hc3.numticket) nb_numtick
    from historique_caisses hc1
    where hc1.ticketannule = '0'
    GROUP BY codemagasin,codevendeur,codeinternearticle,jourdevente,typedevente, typeligne) stats
    WHERE HC.CODEMAGASIN >= '33'
    AND stats.codemagasin = HC.codemagasin
    AND stats.codevendeur = HC.codevendeur
    AND stats.jourdevente = HC.jourdevente
    AND stats.codeinternearticle = HC.codeinternearticle
    AND HC.CODEINTERNEARTICLE >= '50000'
    AND HC.TYPELIGNE IN ('1','2')
    AND HC.JOURDEVENTE = TO_DATE('30/06/2008','DD/MM/YYYY')
    GROUP BY HC.CODEMAGASIN,HC.CODEVENDEUR
    Après, avec des fonctions analytiques bien sentie on peut probablement éviter de parcourir la table 2 fois.

  6. #6
    Membre du Club Avatar de eikeshi
    Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 73
    Points : 61
    Points
    61
    Par défaut
    Ok désolé, je veux aller trop vite.
    Voilà le scripts avec les indexes :
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    CREATE TABLE HISTORIQUE_CAISSES
    (
      CODEMAGASIN            NUMBER(6)              NOT NULL,
      JOURDEVENTE            DATE                   NOT NULL,
      NUMTICKET              NUMBER(10)             NOT NULL,
      NUMLIGNE               NUMBER(3)              NOT NULL,
      CODEINTERNEARTICLE     NUMBER(9)              NOT NULL,
      CODECLIENT             VARCHAR2(20)           NOT NULL,
      CODECAISSE             VARCHAR2(2)            NOT NULL,
      CODECAISSIERE          NUMBER(13),
      CODEVENDEUR            NUMBER(13),
      TYPELIGNE              NUMBER(3),
      VOLVENTE               NUMBER(13,5),
      CANETREALISE           NUMBER(12,2),
      MARGENETTEREALISEE     NUMBER(12,2),
      MTREMISE               NUMBER(12,2),
      ENPROMOTION            NUMBER(1),
      NUMREMISE              NUMBER(6),
      CODETVA                VARCHAR2(1),
      MOTIFRETOUR            NUMBER(3),
      TICKETANNULE           NUMBER(1),
      MATRICULEPERSO         NUMBER(13),
      CODESAISIE             VARCHAR2(40),
      CODECARTE              VARCHAR2(20),
      DATERECHERCHETARIF     DATE,
      MTTVA                  NUMBER(12,2),
      CIAPOUBELLE            NUMBER(8),
      CODEDEVISE             VARCHAR2(3),
      DATEARCHIVAGE          DATE,
      TYPEDEVENTE            NUMBER(1),
      NUMPIECEIDENTITE       VARCHAR2(40),
      NBPOINTSASSOCIETICKET  NUMBER(8),
      CODESAISONGESTION      VARCHAR2(5),
      MTREMISEREEL           NUMBER(12,2),
      MTSURMARQUES           NUMBER(12,2),
      MTSOLDES               NUMBER(12,2),
      DATEENREGISTREMENT     DATE,
      NUMTICKETINIT          NUMBER(10),
      CODESESSION            NUMBER(9),
      MTREMISELIGNE          NUMBER(12,2),
      CODEACTIONMARKETING    NUMBER(10),
      IDTYPERESA             NUMBER(2),
      NUMLIGNERESA           NUMBER(2),
      STOCKMAGNONMAJ         NUMBER(1)
    )
    TABLESPACE DATA
    LOGGING 
    NOCACHE
    NOPARALLEL;
    
    
    CREATE INDEX HISTORIQUE_CAISSES_DAMFK2 ON HISTORIQUE_CAISSES
    (CODEINTERNEARTICLE, IDTYPERESA, JOURDEVENTE, TICKETANNULE)
    LOGGING
    TABLESPACE INDX
    NOPARALLEL;
    
    
    CREATE UNIQUE INDEX HISTORIQUE_CAISSES_PK ON HISTORIQUE_CAISSES
    (CODEMAGASIN, JOURDEVENTE, CODECAISSE, NUMTICKET, NUMLIGNE)
    NOLOGGING
    TABLESPACE INDX
    NOPARALLEL;
    La volumétrie dépasse les 10 millions de lignes.
    Au fait, tu avais raison pour le type NUMBER, encore une erreur du fait de vouloir aller trop vite.
    Vous faut-il autre chose pour pouvoir m'aider ?
    Il y a des jours avec, il y a des jours sans et les jours sans, il faut faire avec.

  7. #7
    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
    du coup :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DECODE(stats.typedevente || stats.codevendeur, '11', nb_tdv, 0)
    Devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DECODE(stats.typedevente , 1, DECODE(stats.codevendeur, 1, nb_tdv,0), 0)

  8. #8
    Membre du Club Avatar de eikeshi
    Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 73
    Points : 61
    Points
    61
    Par défaut
    Ca me génére une erreur ORA-00979 n'est pas une expression GROUP BY , et me surligne stats
    Il y a des jours avec, il y a des jours sans et les jours sans, il faut faire avec.

  9. #9
    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
    Et ce genre de requête :
    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
    WITH HC AS 
    (
    SELECT CODEMAGASIN, CODEVENDEUR,typedevente,numticket,typedevente,codevendeur
    FROM HISTORIQUE_CAISSES HC
    WHERE CODEMAGASIN >= '33'
    AND ticketannule = '0'
    AND CODEINTERNEARTICLE >= '50000'
    AND TYPELIGNE IN (1,2)
    AND JOURDEVENTE = TO_DATE('30/06/2008','DD/MM/YYYY')
    )
    SELECT VENTES.CODEMAGASIN, VENTES.CODEVENDEUR,NBARTICLESVENDUS,NBTICKETSVENTES,NBARTICLESRETOURNES,NBTICKETSRETOUR
    FROM 
    (SELECT CODEMAGASIN, CODEVENDEUR,COUNT(typedevente) AS NBARTICLESVENDUS, COUNT(DISTINCT numticket) AS NBTICKETSVENTES FROM HC WHERE typedevente=1 AND codevendeur=1 GROUP BY CODEMAGASIN, CODEVENDEUR) VENTES, 
    (SELECT CODEMAGASIN, CODEVENDEUR,COUNT(typedevente) AS NBARTICLESRETOURNES, COUNT(DISTINCT numticket) AS AS NBTICKETSRETOUR FROM HC WHERE typedevente=1 AND codevendeur=2 GROUP BY CODEMAGASIN, CODEVENDEUR) RETOURS,
    WHERE VENTES.CODEMAGASIN = RETOURS.CODEMAGASIN
      AND VENTES.CODEVENDEUR = RETOURS.CODEVENDEUR

  10. #10
    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
    Citation Envoyé par eikeshi Voir le message
    Ca me génére une erreur ORA-00979 n'est pas une expression GROUP BY , et me surligne stats
    il y a "quelques" erreurs de syntaxe que je te laisse corriger

  11. #11
    Membre du Club Avatar de eikeshi
    Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 73
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par orafrance Voir le message
    Et ce genre de requête :
    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
    WITH HC AS 
    (
    SELECT CODEMAGASIN, CODEVENDEUR,typedevente,numticket,typedevente,codevendeur
    FROM HISTORIQUE_CAISSES HC
    WHERE CODEMAGASIN >= '33'
    AND ticketannule = '0'
    AND CODEINTERNEARTICLE >= '50000'
    AND TYPELIGNE IN (1,2)
    AND JOURDEVENTE = TO_DATE('30/06/2008','DD/MM/YYYY')
    )
    SELECT VENTES.CODEMAGASIN, VENTES.CODEVENDEUR,NBARTICLESVENDUS,NBTICKETSVENTES,NBARTICLESRETOURNES,NBTICKETSRETOUR
    FROM 
    (SELECT CODEMAGASIN, CODEVENDEUR,COUNT(typedevente) AS NBARTICLESVENDUS, COUNT(DISTINCT numticket) AS NBTICKETSVENTES FROM HC WHERE typedevente=1 AND codevendeur=1 GROUP BY CODEMAGASIN, CODEVENDEUR) VENTES, 
    (SELECT CODEMAGASIN, CODEVENDEUR,COUNT(typedevente) AS NBARTICLESRETOURNES, COUNT(DISTINCT numticket) AS AS NBTICKETSRETOUR FROM HC WHERE typedevente=1 AND codevendeur=2 GROUP BY CODEMAGASIN, CODEVENDEUR) RETOURS,
    WHERE VENTES.CODEMAGASIN = RETOURS.CODEMAGASIN
      AND VENTES.CODEVENDEUR = RETOURS.CODEVENDEUR


    Cette requête génère l'erreur ORA-00903 Nom de table non valide et surligne le WHERE de la partie du code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WHERE VENTES.CODEMAGASIN = RETOURS.CODEMAGASIN
      AND VENTES.CODEVENDEUR = RETOURS.CODEVENDEUR
    Et en plus je ne suis pas censé connaître le numéro de vendeur.
    Je dois sélectionner les ventes, les retours, les tickets ventes et les tickets retours de tous les vendeurs de tous les magasins à une date donnée.

    *Sachant que 1 vente =
    >>count(typedevente)
    >>typedevente =1
    >>typeligne = 1
    >>codeinternearticle >= 50000
    >>ticketannule = 0

    *1 retour =
    >>count(typedevente)
    >>typedevente =1
    >>typeligne = 2
    >>codeinternearticle >= 50000
    >>ticketannule = 0

    *1 ticket vente =
    >>count(distinct numticket)
    >>typedevente = 1
    >>codeinternearticle >= 50000
    >>typeligne = 1
    >>ticketannule = 0

    **1 ticket retour=
    >>count(distinct numticket)
    >>typedevente = 1
    >>codeinternearticle >= 50000
    >>typeligne = 2
    >>ticketannule = 0

    J'espère que c'est plus précis.
    Il y a des jours avec, il y a des jours sans et les jours sans, il faut faire avec.

  12. #12
    Membre du Club Avatar de eikeshi
    Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 73
    Points : 61
    Points
    61
    Par défaut
    Plus de solutions ?

    J'ai essayé les différentes requêtes de orafrance, la dernière me renvoie un résulat mais faux par rapport à ma requête en haut du topic.

    La requête de orafrance corrigée:
    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
    WITH HC AS 
    (
    SELECT CODEMAGASIN,CODEVENDEUR,TYPEDEVENTE,NUMTICKET,TYPELIGNE
    FROM HISTORIQUE_CAISSES HC
    WHERE CODEMAGASIN >= 33
    AND TICKETANNULE = 0
    AND CODEINTERNEARTICLE >= 50000
    AND TYPELIGNE IN (1,2)
    AND JOURDEVENTE LIKE TO_DATE('30/06/2008','DD/MM/YYYY')
    )
    SELECT VENTES.CODEMAGASIN,VENTES.CODEVENDEUR,NBARTICLESVENDUS,NBTICKETSVENTES,NBARTICLESRETOURNES,NBTICKETSRETOUR
    FROM 
    (SELECT CODEMAGASIN, CODEVENDEUR,COUNT(typedevente) AS NBARTICLESVENDUS, COUNT(DISTINCT numticket) AS NBTICKETSVENTES FROM HC WHERE typedevente=1 AND typeligne=1 GROUP BY CODEMAGASIN, CODEVENDEUR) VENTES, 
    (SELECT CODEMAGASIN, CODEVENDEUR,COUNT(typedevente) AS NBARTICLESRETOURNES, COUNT(DISTINCT numticket) AS NBTICKETSRETOUR FROM HC WHERE typedevente=1 AND typeligne=2 GROUP BY CODEMAGASIN, CODEVENDEUR) RETOURS
    WHERE VENTES.CODEMAGASIN = RETOURS.CODEMAGASIN
    AND VENTES.CODEVENDEUR = RETOURS.CODEVENDEUR
    Elle me renvoie quelques bons résultats et en oublis d'autres. Certaines lignes ne sont pas présentes et je ne trouve pas la solution.
    Il y a des jours avec, il y a des jours sans et les jours sans, il faut faire avec.

  13. #13
    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
    t'as moyen de nous envoyer un script qui peuplerait la table, qu'on est un jeu de test significatif pour tester ?

  14. #14
    Membre du Club Avatar de eikeshi
    Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 73
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par orafrance Voir le message
    t'as moyen de nous envoyer un script qui peuplerait la table, qu'on est un jeu de test significatif pour tester ?
    Je suis débutant sur TOAD, y'a moyen de faire ce que tu me demandes à partir de TOAD, si oui, comment ? please.

    Dans un fichier XLS c'est bon ou pas ?
    Il y a des jours avec, il y a des jours sans et les jours sans, il faut faire avec.

  15. #15
    Membre du Club Avatar de eikeshi
    Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 73
    Points : 61
    Points
    61
    Par défaut
    J'envois une série de données test pour donner un meilleur aperçu
    Fichiers attachés Fichiers attachés
    • Type de fichier : xls 0.xls (53,0 Ko, 35 affichages)
    Il y a des jours avec, il y a des jours sans et les jours sans, il faut faire avec.

  16. #16
    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
    Voila qui doit fonctionner :
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    WITH HC AS
    (
    SELECT CODEMAGASIN,CODEVENDEUR,TYPEDEVENTE,NUMTICKET,TYPELIGNE
    FROM HISTORIQUE_CAISSES HC
    WHERE CODEMAGASIN >= 33
    AND TICKETANNULE = 0
    AND typedevente=1
    AND CODEINTERNEARTICLE >= 50000
    AND JOURDEVENTE LIKE TO_DATE('30/06/2008','DD/MM/YYYY')
    )
    SELECT DISTINCT CODEMAGASIN,CODEVENDEUR,
    (Select count(typedevente)
    from hc
    where hc_master.codemagasin = CODEMAGASIN
    and hc_master.codevendeur = CODEVENDEUR
    and typeligne = 1
    ) AS NBARTICLESVENDUS,
    (Select count(typedevente)
    from hc
    where hc_master.codemagasin = CODEMAGASIN
    and hc_master.codevendeur = CODEVENDEUR
    and typeligne = 2
    ) AS NBARTICLESRETOURNES,
    (Select count(distinct numticket)
    from hc
    where hc_master.codemagasin = CODEMAGASIN
    and hc_master.codevendeur = CODEVENDEUR
    and typeligne = 1
    ) AS NBTICKETSVENTES,
    (Select count(distinct numticket)
    from hc
    where hc_master.codemagasin = CODEMAGASIN
    and hc_master.codevendeur = CODEVENDEUR
    and typeligne = 2
    ) AS NBTICKETSRETOURS
    FROM HC hc_master
    ORDER BY 1,2
    /
    J'utilise juste WITH et j'ai "factorisé" les conditions identiques.

  17. #17
    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
    et pour le fun :
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    WITH HC AS
    (SELECT CODEMAGASIN,
            CODEVENDEUR ,
            TYPEDEVENTE ,
            NUMTICKET   ,
            TYPELIGNE
       FROM HISTORIQUE_CAISSES HC
      WHERE CODEMAGASIN        >= 33
        AND TICKETANNULE        = 0
        AND typedevente         =1
        AND CODEINTERNEARTICLE >= 50000
        AND JOURDEVENTE LIKE TO_DATE('30/06/2008','DD/MM/YYYY')
    )
    SELECT DISTINCT hc_master.CODEMAGASIN                         ,
                    hc_master.CODEVENDEUR                         ,
                    NVL(NBARTICLESVENDUS,0) NBARTICLESVENDUS      ,
                    NVL(NBARTICLESRETOURNES,0) NBARTICLESRETOURNES,
                    NVL(NBTICKETSVENTES,0) NBTICKETSVENTES        ,
                    NVL(NBTICKETSRETOURS,0) NBTICKETSRETOURS
    FROM            HC hc_master                                   ,
                    (SELECT  CODEMAGASIN                           ,
                             CODEVENDEUR                           ,
                             COUNT(typedevente)        AS NBARTICLESVENDUS,
                             COUNT(DISTINCT numticket) AS NBTICKETSVENTES
                    FROM     hc
                    WHERE    typeligne = 1
                    GROUP BY CODEMAGASIN,
                             CODEVENDEUR
                    ) hc1                                             ,
                    (SELECT  CODEMAGASIN                              ,
                             CODEVENDEUR                              ,
                             COUNT(typedevente)        AS NBARTICLESRETOURNES,
                             COUNT(DISTINCT numticket) AS NBTICKETSRETOURS
                    FROM     hc
                    WHERE    typeligne = 2
                    GROUP BY CODEMAGASIN,
                             CODEVENDEUR
                    ) hc2
    WHERE           hc_master.CODEMAGASIN = hc1.CODEMAGASIN (+)
                AND hc_master.CODEVENDEUR = hc1.CODEVENDEUR (+)
                AND hc_master.CODEMAGASIN = hc2.CODEMAGASIN (+)
                AND hc_master.CODEVENDEUR = hc2.CODEVENDEUR (+)
    ORDER BY        1,2 
    /

  18. #18
    Membre du Club Avatar de eikeshi
    Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 73
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par orafrance Voir le message
    et pour le fun :
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    WITH HC AS
    (SELECT CODEMAGASIN,
            CODEVENDEUR ,
            TYPEDEVENTE ,
            NUMTICKET   ,
            TYPELIGNE
       FROM HISTORIQUE_CAISSES HC
      WHERE CODEMAGASIN        >= 33
        AND TICKETANNULE        = 0
        AND typedevente         =1
        AND CODEINTERNEARTICLE >= 50000
        AND JOURDEVENTE LIKE TO_DATE('30/06/2008','DD/MM/YYYY')
    )
    SELECT DISTINCT hc_master.CODEMAGASIN                         ,
                    hc_master.CODEVENDEUR                         ,
                    NVL(NBARTICLESVENDUS,0) NBARTICLESVENDUS      ,
                    NVL(NBARTICLESRETOURNES,0) NBARTICLESRETOURNES,
                    NVL(NBTICKETSVENTES,0) NBTICKETSVENTES        ,
                    NVL(NBTICKETSRETOURS,0) NBTICKETSRETOURS
    FROM            HC hc_master                                   ,
                    (SELECT  CODEMAGASIN                           ,
                             CODEVENDEUR                           ,
                             COUNT(typedevente)        AS NBARTICLESVENDUS,
                             COUNT(DISTINCT numticket) AS NBTICKETSVENTES
                    FROM     hc
                    WHERE    typeligne = 1
                    GROUP BY CODEMAGASIN,
                             CODEVENDEUR
                    ) hc1                                             ,
                    (SELECT  CODEMAGASIN                              ,
                             CODEVENDEUR                              ,
                             COUNT(typedevente)        AS NBARTICLESRETOURNES,
                             COUNT(DISTINCT numticket) AS NBTICKETSRETOURS
                    FROM     hc
                    WHERE    typeligne = 2
                    GROUP BY CODEMAGASIN,
                             CODEVENDEUR
                    ) hc2
    WHERE           hc_master.CODEMAGASIN = hc1.CODEMAGASIN (+)
                AND hc_master.CODEVENDEUR = hc1.CODEVENDEUR (+)
                AND hc_master.CODEMAGASIN = hc2.CODEMAGASIN (+)
                AND hc_master.CODEVENDEUR = hc2.CODEVENDEUR (+)
    ORDER BY        1,2 
    /

    Je te remercie, je gagne 10 secondes avec cette requête par rapport à la mienne qui dure 42 secondes. En plus je ne connaissais pas cette façon d'écrire une requête.
    Ton aide a été précieuse, encore merci !
    Il y a des jours avec, il y a des jours sans et les jours sans, il faut faire avec.

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

Discussions similaires

  1. [Access] Optimisation performance requête - Index
    Par fdraven dans le forum Access
    Réponses: 11
    Dernier message: 12/08/2005, 14h30
  2. Optimisation de requête avec Tkprof
    Par stingrayjo dans le forum Oracle
    Réponses: 3
    Dernier message: 04/07/2005, 09h50
  3. Optimiser une requête SQL d'un moteur de recherche
    Par kibodio dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/03/2005, 20h55
  4. optimisation des requêtes
    Par yech dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 21/09/2004, 19h03
  5. Optimisation de requête
    Par olivierN dans le forum SQL
    Réponses: 10
    Dernier message: 16/12/2003, 10h09

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