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 d'une requete


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 27
    Par défaut Optimisation d'une requete
    Bonjour a tous,

    J'ai besoin d'aide pour le tunning d'une requête :

    Problème 1 : j'ai identifié 2 tables , il doit manquer des indexes mais il n'y a aucunes trace de l'appel de ces deux tables dans la requête
    --> voir les lignes 21 & 22 de l'exécution plan ( en rouge)

    Problème 2 : dans l'exécution plan , à la ligne 8 on trouve VW_NSO_1 : je n'ai trouvé aucune trace dans la base d'une table ou vue avec ce nom..... je ne sais pas ce que c'est.
    --> voir ligne 8 de l'execution plan

    ---

    voila la requete :

    -- requete

    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
    SELECT *
        FROM
            V_VOL_TRONCON_JOUR
        WHERE
            TO_DATE(TO_CHAR(TVJ_DATEVOL, 'DD/MM/YYYY') || ' ' || TO_CHAR(VJO_HHMMDEP, 'HH24:MI'), 'DD/MM/YYYY HH24:MI')
                BETWEEN :B9 AND :B8
                    AND ( :B7 IS NULL OR TVJ_CODECLI = :B7 )
                    AND ( :B6 != 3 OR TVJ_CODECLI
                        IN (
                            SELECT DCLI_CODECLI
                            FROM DTCLIENT
                            WHERE DCLI_CODEUTI = :B10 )
                            )
                    AND TVJ_CODECLI IN
                        (     SELECT CLI_CODECLI
                                FROM COMARM, VALJOURATEL
                                WHERE
                                    VJA_DATE BETWEEN SUBSTR(:B9 , 1, 10)
                                    AND SUBSTR(:B8 , 1, 10)
                                    AND VJA_CODESIT = :B5
                                    AND VJA_CODEATEL = :B11
                                    AND VJA_KEYCLI = 'ZZZZZZZ'
                                    AND CLI_LCTSPE = '0'
                            UNION
                            SELECT CLI_CODECLI
                                FROM COMARM, VALJOURATEL
                                WHERE VJA_DATE BETWEEN SUBSTR(:B9 , 1, 10)
                                    AND SUBSTR(:B8 , 1, 10)
                                    AND VJA_CODESIT = :B5
                                    AND VJA_CODEATEL = :B11
                                    AND VJA_KEYCLI = CLI_CODECLI
                                    AND CLI_LCTSPE = '1'
                        )
                    AND TVJ_ACCROCHAGE NOT IN ('P', 'D', 'A', 'V')
                    AND TVJ_PDT_CODECLI IS NOT NULL
                    AND TVJ_PDT_CODEPDT IS NOT NULL
                    AND ( :B5 IN
                          (    SELECT STVJ_CODESIT
                            FROM SITE_TVJ
                            WHERE STVJ_DATEVOL = TVJ_DATEVOL
                            AND STVJ_CODECLI = TVJ_CODECLI
                            AND STVJ_NOVOL = TVJ_NOVOL
                            AND STVJ_NOTRONC = TVJ_NOTRONC
                            AND STVJ_CODESIT = :B5
                          )
                    OR TVJ_CODESIT = :B5
                    OR TVJ_CODESIT IS NULL
                        )
                    AND ( VJO_ANNUL IS NULL
                    OR VJO_ANNUL <> 'A')
                    AND (
                         'Tout' IN (:B4 , :B3 , :B2 , :B1 )
                          OR NVL(TVJ_TVOL_CODETVOL, 'Sans type')
                          IN (:B4 , :B3 , :B2 , :B1 )
                        )
                    ORDER BY TVJ_DATEVOL, TO_CHAR(VJO_HHMMDEP, 'HH24:MI')
    ---> les bind variables (vues dans v$sql_bind_capture)

    NAME VALUE_STRING
    -------------- --------------------------------------------------
    :B1 ****
    :B10 NOM
    :B10 PRENOM
    :B11 APC
    :B11 DQ
    :B11 SEVG
    :B2 ****
    :B3 comptes
    :B3 ville
    :B4 3ème niveau
    :B4 CM2
    :B5 BHD1
    :B5 S2
    :B6 1
    :B6 2
    :B7 FA
    :B8 10/06/2009 23:59:00
    :B8 11/06/2009 23:59:00
    :B9 10/06/2009 00:00:00
    :B9 11/06/2009 00:00:00

    Execution Plan
    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
    
    ----------------------------------------------------------------------------------------------------------
    | Id  | Operation                               | Name           | Rows  | Bytes | Cost (%CPU)| Time     |
    ----------------------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT                        |                |       |       |  4799 (100)|          |
    |   1 |  SORT ORDER BY                          |                |     1 |   160 |  4799   (2)| 00:00:58 |
    |   2 |   FILTER                                |                |       |       |            |          |
    |   3 |    FILTER                               |                |       |       |            |          |
    |   4 |     FILTER                              |                |       |       |            |          |
    |   5 |      NESTED LOOPS OUTER                 |                |    15 |  2400 |  4798   (2)| 00:00:58 |
    |   6 |       HASH JOIN                         |                |    15 |  1980 |  4783   (2)| 00:00:58 |
    |   7 |        HASH JOIN                        |                |  6022 |   546K|  3431   (2)| 00:00:42 |
    |   8 |         VIEW                            | VW_NSO_1       |     3 |    12 |     1   (0)| 00:00:01 |
    |   9 |          SORT UNIQUE                    |                |       |       |            |          |
    |  10 |           UNION-ALL                     |                |       |       |            |          |
    |  11 |            FILTER                       |                |       |       |            |          |
    |  12 |             MERGE JOIN CARTESIAN        |                |    11 |   286 |     5   (0)| 00:00:01 |
    |  13 |              INDEX RANGE SCAN           | VALJOURATEL_PK |     1 |    20 |     2   (0)| 00:00:01 |
    |  14 |              BUFFER SORT                |                |   163 |   978 |     3   (0)| 00:00:01 |
    |  15 |               TABLE ACCESS FULL         | COMARM         |   163 |   978 |     3   (0)| 00:00:01 |
    |  16 |            FILTER                       |                |       |       |            |          |
    |  17 |             NESTED LOOPS                |                |     1 |    26 |     3   (0)| 00:00:01 |
    |  18 |              INDEX RANGE SCAN           | VALJOURATEL_PK |     1 |    20 |     2   (0)| 00:00:01 |
    |  19 |              TABLE ACCESS BY INDEX ROWID| COMARM         |     1 |     6 |     1   (0)| 00:00:01 |
    |  20 |               INDEX UNIQUE SCAN         | COMARM_PK      |     1 |       |     0   (0)|          |
    |  21 |         TABLE ACCESS FULL               | TRONCON_VJ     |   214K|    18M|  3428   (2)| 00:00:42 |
    |  22 |        TABLE ACCESS FULL                | VOL_JOUR       |   965K|    35M|  1346   (3)| 00:00:17 |
    |  23 |       TABLE ACCESS BY INDEX ROWID       | VOL_BASE       |     1 |    28 |     1   (0)| 00:00:01 |
    |  24 |        INDEX UNIQUE SCAN                | VOL_BASE_PK    |     1 |       |     0   (0)|          |
    |  25 |    INDEX UNIQUE SCAN                    | DTCLIENT_PK    |     1 |    12 |     1   (0)| 00:00:01 |
    |  26 |     FILTER                              |                |       |       |            |          |
    |  27 |      TABLE ACCESS BY INDEX ROWID        | SITE_TVJ       |     1 |    21 |     2   (0)| 00:00:01 |
    |  28 |       INDEX RANGE SCAN                  | SITE_TVJ_PK    |     1 |       |     1   (0)| 00:00:01 |
    ----------------------------------------------------------------------------------------------------------
    

  2. #2
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par rohrim Voir le message
    ...
    Problème 1 : j'ai identifié 2 tables , il doit manquer des indexes mais il n'y a aucunes trace de l'appel de ces deux tables dans la requête
    --> voir les lignes 21 & 22 de l'exécution plan ( en rouge)
    Très probablement les deux tables sont cachées par une vue.
    Commencer toujours par le recalcule des statistiques et l'anlyse de la requête.

    Pour le problème 2 il se peut que la vue en question n'existe pas d'une manière identifiée. Mais pour l'instant vos soucis ne sont pas la.

  3. #3
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Il me semble que les view VW_NSO_1 sont en fait des vues "dynamiques" créées au sein même de la requête.

  4. #4
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 27
    Par défaut
    merci pour cet éclaircissement ,
    j'imagine que cette vue dynamique va chercher les 2 tables absentes de la requete
    Et si , oui, comment je fais pour savoir quelle colonnes de ces 2 tables il va chercher ?

  5. #5
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 27
    Par défaut
    ok j'ai trouvé

    quand la requête fait un sort unique et que la/les colonnes interrogées ne sont pas uniques , le CBO de oracle crée une vue pour faire le tri

  6. #6
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Merci d'avoir posté ta trouvaille, je saurai dans quels cas CBO l'utilise, maintenant

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

Discussions similaires

  1. Optimisation d'une requete "TOP 5"
    Par gregb34 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 04/05/2006, 17h17
  2. Réponses: 5
    Dernier message: 14/04/2006, 18h58
  3. Optimisation d'une requete récurrente
    Par winzou dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 23/01/2006, 22h07
  4. Optimisation d'une requete specifique
    Par Tchinkatchuk dans le forum Langage SQL
    Réponses: 9
    Dernier message: 16/12/2005, 14h14
  5. optimisation d'une requete de recherche
    Par moog dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 06/04/2005, 16h58

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