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 :

[Débutant] optimiser une requète


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 111
    Points : 54
    Points
    54
    Par défaut [Débutant] optimiser une requète
    Bonjour,
    je dois faire une optimisation de ma requète car elle atteint une durée de traitement de 11s en étant loin de la charge qu'il faudra supporter en prod.

    j'avoue ne pas être un pro de sql et encore moins sous oracle donc si il y avait une ou plusieurs ames charitables.

    donc ma requête affiche pour chaque interface et type le nombre d'entité en attente de traitement, en erreur, archivé et traité le tout selon un statut.

    voici ma requête actuelle :
    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
     
    /* Formatted on 2009/01/27 15:04 (Formatter Plus v4.8.8) */
    SELECT   entite.INTERFACE, TRIM (entite.type_entite) AS expr1,
             tab_wait.nb_wait, tab_send.nb_send, tab_err.nb_err, tab_arc.nb_arc,
             MAX (entite.creation) AS LAST
        FROM entite
             FULL OUTER JOIN
             (SELECT   COUNT (DISTINCT id_entite) AS nb_wait,
                       TRIM (type_entite) AS typetrim, INTERFACE
                  FROM entite entite_3
                 WHERE (INTERFACE LIKE 'NG%') AND (statut = 0)
              GROUP BY INTERFACE, TRIM (type_entite)) tab_wait
             ON TRIM (entite.type_entite) = TRIM (tab_wait.typetrim)
           AND entite.INTERFACE = tab_wait.INTERFACE
             FULL OUTER JOIN
             (SELECT   COUNT (DISTINCT id_entite) AS nb_send,
                       TRIM (type_entite) AS typetrim, INTERFACE
                  FROM entite entite_2
                 WHERE (INTERFACE LIKE 'NG%') AND (statut = 9)
              GROUP BY INTERFACE, TRIM (type_entite)) tab_send
             ON TRIM (entite.type_entite) = tab_send.typetrim
           AND entite.INTERFACE = tab_send.INTERFACE
             FULL OUTER JOIN
             (SELECT   COUNT (DISTINCT id_entite) AS nb_err,
                       TRIM (type_entite) AS typetrim, INTERFACE
                  FROM entite entite_1
                 WHERE (INTERFACE LIKE 'NG%') AND (statut = 1)
              GROUP BY INTERFACE, TRIM (type_entite)) tab_err
             ON TRIM (entite.type_entite) = tab_err.typetrim
           AND entite.INTERFACE = tab_err.INTERFACE
             FULL OUTER JOIN
             (SELECT   COUNT (DISTINCT id_entite) AS nb_arc,
                       TRIM (type_entite) AS typetrim, INTERFACE
                  FROM entite entite_1
                 WHERE (INTERFACE LIKE 'NG%') AND (statut = 8)
              GROUP BY INTERFACE, TRIM (type_entite)) tab_arc
             ON TRIM (entite.type_entite) = tab_arc.typetrim
           AND entite.INTERFACE = tab_arc.INTERFACE
    GROUP BY entite.INTERFACE,
             TRIM (entite.type_entite),
             tab_wait.nb_wait,
             tab_send.nb_send,
             tab_err.nb_err,
             tab_arc.nb_arc
    ORDER BY entite.INTERFACE
    merci d'avance

  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 : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    essaye un truc de ce style :

    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
    WITH cpt_entite AS
    (SELECT   COUNT (DISTINCT id_entite) AS nb_wait,
                       TRIM (type_entite) AS typetrim, 
                 INTERFACE, 
                 statut
                  FROM entite 
                 WHERE INTERFACE LIKE 'NG%'
    GROUP BY INTERFACE, TRIM (type_entite), statut
    )
    SELECT   entite.INTERFACE, TRIM (entite.type_entite) AS expr1,
             tab_wait.nb_wait, tab_send.nb_send, tab_err.nb_err, tab_arc.nb_arc,
             MAX (entite.creation) AS LAST
        FROM entite
             FULL OUTER JOIN
             (SELECT   nb_wait,
                       typetrim, INTERFACE
                  FROM cpt_entite
                 WHERE (statut = 0)) tab_wait
             ON TRIM (entite.type_entite) = tab_wait.typetrim
           AND entite.INTERFACE = tab_wait.INTERFACE
             FULL OUTER JOIN
             (SELECT   nb_wait,
                       typetrim, INTERFACE
                  FROM cpt_entite
                 WHERE (statut = 9)) tab_wait
             ON TRIM (entite.type_entite) = tab_wait.typetrim
           AND entite.INTERFACE = tab_wait.INTERFACE
             FULL OUTER JOIN
             (SELECT   nb_wait,
                       typetrim, INTERFACE
                  FROM cpt_entite
                 WHERE (statut = 0)) tab_wait
             ON TRIM (entite.type_entite) = tab_err.typetrim
           AND entite.INTERFACE = tab_err.INTERFACE
             FULL OUTER JOIN
             (SELECT   nb_wait,
                       typetrim, INTERFACE
                  FROM cpt_entite
                 WHERE (statut = 8)) tab_arc
             ON TRIM (entite.type_entite) = tab_arc.typetrim
           AND entite.INTERFACE = tab_arc.INTERFACE
    GROUP BY entite.INTERFACE,
             TRIM (entite.type_entite),
             tab_wait.nb_wait,
             tab_send.nb_send,
             tab_err.nb_err,
             tab_arc.nb_arc
    ORDER BY entite.INTERFACE
    et faudrait pas ajouter la clause WHERE entite.INTERFACE LIKE 'NG%' ?

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    J'ai pas bien saisi le schema (pourquoi count(distinct) ?)
    Mais qu'est ce que ça donne cette requête (sans garanti, plus au cas où ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT   interface, TRIM (type_entite) AS expr1,
             sum(case when statut = 0 then 1 else 0 end) nb_wait,
             sum(case when statut = 9 then 1 else 0 end) nb_send,
             sum(case when statut = 1 then 1 else 0 end) nb_err,
             sum(case when statut = 8 then 1 else 0 end) nb_arc,
             MAX (entite.creation) AS LAST
    FROM entite
    WHERE interface LIKE 'NG%'
    GROUP BY interface,TRIM (type_entite)
    ORDER BY interface

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    401
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 401
    Points : 120
    Points
    120
    Par défaut
    Petite question en passant.

    Est-ce que la clause WITH optimise par rapport à une table déclarée directement comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * 
    FROM ( SELECT * FROM MA_TABLE) TEMP
    ou bien c'est juste pour une visibilité accrue de l'ordre ?

  5. #5
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 111
    Points : 54
    Points
    54
    Par défaut
    alors bon effectivement le distinct ne sert à rien ca restait d'un premier essai je suis passé de 11s a 6s c'est déja pas mal. et je dois avouer skuatamad ca marche bien et je suis tombé a 858 ms reste a voir les index de ma table.

    par contre j'avoue ne pas avoir compris ce que proposait orafrance

    bon dans tous les cas je peux mettre résolu merci encore à vous

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Si c'était très lent c'était à cause du "FULL OUTER JOIN" qui est une clause de jointure très gourmande, et il y en avait quatre dans votre requête.

    Si les résultats proposés par skuatamad concordent, c'est que vous n'en aviez pas besoin.

    Orafrance à simplement réécrit une partie de votre requête en conservant la structure et en factorisant la partie identique de vos quatre sous-requêtes.

  7. #7
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 111
    Points : 54
    Points
    54
    Par défaut
    merci pour l'explication, effectivement les "full outer join" n'étaient pas utile j'ai tendance à partir compliqué pour pas grand chose.
    mais je vais travailler sur ce principe de factorisation ca peut être interressant.

  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 : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    WITH évite tout simplement de chercher plusieurs fois les données. J'avoue que je ne me suis pas intéresser à l'aspect fonctionnel des choses

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

Discussions similaires

  1. Optimiser une requête de "classement"
    Par Manu0086 dans le forum Requêtes
    Réponses: 7
    Dernier message: 09/03/2006, 18h47
  2. besoin d'aide pour optimiser une requête
    Par jisse dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/01/2006, 09h41
  3. Problème de débutant dans une requête
    Par decour dans le forum Access
    Réponses: 7
    Dernier message: 14/10/2005, 14h17
  4. Optimiser une requête..est-ce possible ?
    Par Thierry8 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 27/09/2005, 11h31
  5. 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

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