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

Administration Oracle Discussion :

Optimisation de jointure


Sujet :

Administration Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2009
    Messages : 13
    Par défaut Optimisation de jointure
    Bonjour,

    pouvez-vous analyser cette requête et m'indiquer quelles optimisations peuvent être mises en place (quels champs à indexer, index composite..etc.). Je vous en remercie d'avance

    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 to_char(C.date_stat,'yyyy/mm') AS DATE_STAT,
            to_char(L.date_stat,'yyyy/mm') AS DATE_STAT_M,
            C.classe, C.service,
            L.classe, L.service,
            avg(C.tps) AS TEMPS_MOY,
            avg(L.tps) AS TEMPS_MOY_M,
            PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY C.tps DESC) AS TEMPS_MED,
            PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY L.tps DESC) AS TEMPS_MED_M
     
    FROM STAT C, STAT L
     
    WHERE C.date_stat BETWEEN TRUNC( SYSDATE, 'MM' ) AND last_day(SYSDATE)
    AND L.date_stat BETWEEN TRUNC( ADD_MONTHS(SYSDATE, -1), 'MM') AND last_day(ADD_MONTHS(SYSDATE, -1))
    AND C.classe = L.classe
    AND C.service = L.service
     
    GROUP BY
    	to_char(C.date_stat,'yyyy/mm'),to_char(L.date_stat,'yyyy/mm'),C.classe,C.service, L.classe, L.service
    Un index normal non unique composite est déjà créé sur :

    1 service
    2 date_stat
    3 un autre champ non utilisé dans la requête

    MERCI.

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    quel est le plan d'exécution ?

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2009
    Messages : 13
    Par défaut
    Citation Envoyé par orafrance Voir le message
    quel est le plan d'exécution ?
    EDIT: J'avais oublié la médiane :

    SELECT STATEMENT CHOOSE 3066 1859 230516
    SORT(GROUP BY) 3066 1859 230516
    FILTER
    HASH JOIN 3029 1859 230516
    TABLE ACCESS(FULL) STAT ANALYZED 1512 3568 221216
    TABLE ACCESS(FULL) STAT ANALYZED 1512 3568 221216

    Merci

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Moi j'essayerai de créer un index sur (service, classe, date_stat)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Moi j'essayerai de créer un index sur (service, classe, date_stat)

    Si tu enlèves les fonctions de regroupement, ça ramène combien de lignes ?

    Que donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT COUNT(*) 
    FROM STAT C, STAT L
     WHERE C.date_stat BETWEEN TRUNC( SYSDATE, 'MM' ) AND last_day(SYSDATE)
    AND L.date_stat BETWEEN TRUNC( ADD_MONTHS(SYSDATE, -1), 'MM') AND last_day(ADD_MONTHS(SYSDATE, -1))
    AND C.classe = L.classe
    AND C.service = L.service
    Et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT COUNT(*) FROM STAT

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2009
    Messages : 13
    Par défaut
    Citation Envoyé par orafrance Voir le message
    Moi j'essayerai de créer un index sur (service, classe, date_stat)

    Si tu enlèves les fonctions de regroupement, ça ramène combien de lignes ?

    Que donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT COUNT(*) 
    FROM STAT C, STAT L
     WHERE C.date_stat BETWEEN TRUNC( SYSDATE, 'MM' ) AND last_day(SYSDATE)
    AND L.date_stat BETWEEN TRUNC( ADD_MONTHS(SYSDATE, -1), 'MM') AND last_day(ADD_MONTHS(SYSDATE, -1))
    AND C.classe = L.classe
    AND C.service = L.service
    ça mouline encore.. c'est très mais très long..

    Et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT COUNT(*) FROM STAT
    1446968


    Je vais essayer avec l'index sur (service, classe, date_stat) dans cet ordre?

    Merci.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2009
    Messages : 13
    Par défaut
    Citation Envoyé par orafrance Voir le message
    Moi j'essayerai de créer un index sur (service, classe, date_stat)
    Comme j'utilise un to_char sur date_stat ça risque pas de zapper l'index? Ne devrais-je pas en créer un sur to_char(date_stat,'yyyy/mm') ?

    Merci.

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2009
    Messages : 13
    Par défaut Tests avec INDEX(service, classe, to_char(date_stat,'yyyy/mm'), tps)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT to_char(C.date_stat,'yyyy/mm') AS DATE_STAT,
            to_char(L.date_stat,'yyyy/mm') AS DATE_STAT_M,
            C.service,
            L.service,
            C.tps AS TEMPS_MOY,
            L.tps AS TEMPS_MOY_M
     
    FROM STAT C, STAT L
     
    WHERE to_char(C.date_stat,'yyyy/mm') = to_char(SYSDATE,'yyyy/mm')
    AND to_char(L.date_stat,'yyyy/mm') = to_char(ADD_MONTHS(SYSDATE, -1),'yyyy/mm')
    AND C.classe = L.classe
    AND C.service = L.service
    Je suis en INDEX ACCESS FULL :

    SELECT STATEMENT CHOOSE 11373 34018300 4218269200
    HASH JOIN 11373 34018300 4218269200
    INDEX(FAST FULL SCAN) TUXEDO.STAT_BC_IDX2 ANALYZED 1492 482727 29929074
    INDEX(FAST FULL SCAN) TUXEDO.STAT_BC_IDX2 ANALYZED 1492 482727 29929074

    Dès que je remets mes agrégations je repasse en TABLE ACCESS FULL

    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
    SELECT to_char(C.date_stat,'yyyy/mm') AS DATE_STAT,
            to_char(L.date_stat,'yyyy/mm') AS DATE_STAT_M,
            C.classe, C.service,
            L.classe, L.service,
            avg(C.tps) AS TEMPS_MOY,
            avg(L.tps) AS TEMPS_MOY_M,
            PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY C.tps DESC) AS TEMPS_MED,
            PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY L.tps DESC) AS TEMPS_MED_M
     
    FROM TSTAT C, STAT L
     
    WHERE to_char(C.date_stat,'yyyy/mm') = to_char(SYSDATE,'yyyy/mm')
    AND to_char(L.date_stat,'yyyy/mm') = to_char(ADD_MONTHS(SYSDATE, -1),'yyyy/mm')
    AND C.classe = L.classe
    AND C.service = L.service
     
    GROUP BY
    	to_char(C.date_stat,'yyyy/mm'),to_char(L.date_stat,'yyyy/mm'),C.classe,C.service, L.classe, L.service
    SELECT STATEMENT CHOOSE 1337915 34018300 4218269200
    SORT(GROUP BY) 1337915 34018300 4218269200
    HASH JOIN 11413 34018300 4218269200
    TABLE ACCESS(FULL) TUXEDO.STAT_BC ANALYZED 1512 482727 29929074
    TABLE ACCESS(FULL) TUXEDO.STAT_BC ANALYZED 1512 482727 29929074


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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Non puisque la fonction to_char est dans le SELECT et pas la jointure

    Edit : ha oui, tu as ajouté du to_char, c'était mieux avant

    Alors pourquoi l'agrégat change le plan ?

  10. #10
    Membre extrêmement actif
    Avatar de Golgotha
    Homme Profil pro
    Full-stack Web Developer
    Inscrit en
    Août 2007
    Messages
    1 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Full-stack Web Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2007
    Messages : 1 387
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Skandy Voir le message
    Comme j'utilise un to_char sur date_stat ça risque pas de zapper l'index? Ne devrais-je pas en créer un sur to_char(date_stat,'yyyy/mm') ?

    Merci.
    Je pense que oui.. ne peut tu pas ajouter le bon format directement dans ta table ou faire une vue matérialisée pour ne pas avoir de to_char

    Que donne ta requête sans to_char ?
    Consultant et développeur full-stack spécialiste du Web
    faq jQuery - règles du forum - faqs web

Discussions similaires

  1. [SQL] Optimiser une jointure dans PHP
    Par Invité dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 11/08/2006, 17h56
  2. Réponses: 15
    Dernier message: 14/04/2006, 15h34
  3. Réponses: 9
    Dernier message: 30/01/2006, 08h42
  4. Optimiser les jointures dans des requêtes
    Par klereth dans le forum PostgreSQL
    Réponses: 12
    Dernier message: 23/04/2005, 17h29
  5. Comment optimiser une jointure ?
    Par seb_asm dans le forum Administration
    Réponses: 21
    Dernier message: 25/06/2004, 16h42

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