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 :

requête qui rame avec MERGE JOIN CARTESIAN et LATCH cache buffer chains


Sujet :

Administration Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 750
    Par défaut requête qui rame avec MERGE JOIN CARTESIAN et LATCH cache buffer chains
    Bonjour,

    Je travaille pour un éditeur de logiciel.
    Un de nos clients (en 10g R2) a vu sa session bloquer sur la requête suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT 1 FROM DUAL WHERE EXISTS (SELECT 1 FROM VCHKCL X WHERE X.COMAR IN ('ICE') AND TRUNC(X.DATOP,'DD')<=TO_DATE('09062009','DDMMYYYY') AND TRUNC(X.DANEG,'DD')> TO_DATE('09062009','DDMMYYYY'))
    VCHKCL est une vue. voici sa définition:
    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
     
    CREATE OR REPLACE VIEW VCHKCL
    (COMAR,NCOCL,NFICL,NUCON,NUFDP,DANEG,COINF,COINC,
     CNACT,CMECH,CAECH,CSOPT,MTSNA,QTCLO,COTSJ,DATOP,NUCPT,NUBIX,NUBCL)
    AS 
    SELECT 
    M.COMAR,D.NUCON,D.NUFDP,M.NUCON,M.NUFDP,NVL(C.DAEOD,C.DATOP),N.COINF,D.COINC,
    N.CNACT,N.CMECH,N.CAECH,N.CSOPT,N.MTSNA,M.QTCLO,A.COTSJ,NVL(N.DAEOD,N.DATOP),D.NUCPT,M.NUBIX,M.NUBCL
    FROM 
    MATCLO M,
    FICDEP D,
    FICNEG N,
    FICNEG C,
    NATACF A 
    WHERE 
    D.NUBIX=M.NUBCL AND 
    D.NUFDP=M.NFICL AND 
    N.NUBIX=M.NUBCL AND 
    C.NUBIX=M.NUBIX AND 
    A.CNACT=N.CNACT;
    Les tables MATCLO, FICDEP et FICNEG sont partitionnées by range sur le champ COMAR.
    La table NATACF n'est pas partitionnée.

    En regardant dans v$session_wait j'ai vu que la session était bloquée sur l'évenement LATCH cache buffer chains.

    Le plan d'execution de la requête est le suivant:
    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
     
    Avant 
    ------------------------------------------------------------------------------------------------------------------ 
    |   0 | SELECT STATEMENT                       |         |       |       |   339 (100)|          |       |       | 
    |   1 |  FILTER                                |         |       |       |            |          |       |       | 
    |   2 |   FAST DUAL                            |         |     1 |       |     2   (0)| 00:00:01 |       |       | 
    |   3 |   NESTED LOOPS                         |         |     1 |   146 |   337   (0)| 00:00:02 |       |       | 
    |   4 |    NESTED LOOPS                        |         |     1 |   115 |   336   (0)| 00:00:02 |       |       | 
    |   5 |     NESTED LOOPS                       |         |     1 |    72 |   334   (1)| 00:00:02 |       |       | 
    |   6 |      MERGE JOIN CARTESIAN              |         |     1 |    35 |   329   (0)| 00:00:02 |       |       | 
    |   7 |       INDEX FULL SCAN                  | FICDEP1 |     1 |    26 |   315   (0)| 00:00:02 |       |       | 
    |   8 |       BUFFER SORT                      |         | 45493 |   399K|    14   (0)| 00:00:01 |       |       | 
    |   9 |        INDEX FULL SCAN                 | NATACF1 | 45493 |   399K|    14   (0)| 00:00:01 |       |       | 
    |  10 |      PARTITION RANGE ALL               |         |    13 |   481 |     4   (0)| 00:00:01 |     1 |    45 | 
    |  11 |       TABLE ACCESS BY LOCAL INDEX ROWID| FICNEG  |    13 |   481 |     4   (0)| 00:00:01 |     1 |    45 | 
    |  12 |        INDEX RANGE SCAN                | FICNEG2 |     1 |       |     4   (0)| 00:00:01 |     1 |    45 | 
    |  13 |     PARTITION RANGE SINGLE             |         |     1 |    43 |     2   (0)| 00:00:01 |   KEY |   KEY | 
    |  14 |      TABLE ACCESS BY LOCAL INDEX ROWID | MATCLO  |     1 |    43 |     2   (0)| 00:00:01 |   KEY |   KEY | 
    |  15 |       INDEX RANGE SCAN                 | MATCLO2 |   899 |       |     1   (0)| 00:00:01 |   KEY |   KEY | 
    |  16 |    TABLE ACCESS BY GLOBAL INDEX ROWID  | FICNEG  |     1 |    31 |     1   (0)| 00:00:01 | ROW L | ROW L | 
    |  17 |     INDEX UNIQUE SCAN                  | FICNEG1 |     1 |       |     1   (0)| 00:00:01 |       |       | 
    ------------------------------------------------------------------------------------------------------------------
    La requête reste bloquée pendant des heures.
    Il n'y a pas de stats sur les tables MATCLO, FICDEP et FICNEG mais le paramètre OPTIMZER_DYNAMIC_SAMPLING est positionné à 2.
    Par contre, les stats sont présentes pour NATACF.

    Cette requête est exécutée via notre progiciel.
    En exécutant la même requête à part sous sqlplus et sur la même base du client celle ci s'exécute instantanément.

    En killant la session et en relancant l'application, la session reste bloquée tjr sur la même requête et tjr avec le même événement d'attente.

    En modifiant la vue pour y rajouter les critères de partitionnement le problème ne se pose plus et le plan d'execution devient le suivant:
    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
    Après 
     
    ------------------------------------------------------------------------------------------------------------------- 
    | Id  | Operation                               | Name    | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop | 
    ------------------------------------------------------------------------------------------------------------------- 
    |   0 | SELECT STATEMENT                        |         |       |       |     8 (100)|          |       |       | 
    |   1 |  FILTER                                 |         |       |       |            |          |       |       | 
    |   2 |   FAST DUAL                             |         |     1 |       |     2   (0)| 00:00:01 |       |       | 
    |   3 |   NESTED LOOPS                          |         |     1 |    92 |     6   (0)| 00:00:01 |       |       | 
    |   4 |    NESTED LOOPS                         |         |     1 |    78 |     5   (0)| 00:00:01 |       |       | 
    |   5 |     NESTED LOOPS                        |         |     1 |    49 |     4   (0)| 00:00:01 |       |       | 
    |   6 |      NESTED LOOPS                       |         |     1 |    28 |     3   (0)| 00:00:01 |       |       | 
    |   7 |       PARTITION RANGE SINGLE            |         |    20 |   220 |     1   (0)| 00:00:01 |   KEY |   KEY | 
    |   8 |        TABLE ACCESS BY LOCAL INDEX ROWID| FICDEP  |    20 |   220 |     1   (0)| 00:00:01 |   KEY |   KEY | 
    |   9 |         INDEX RANGE SCAN                | FICDEP4 |     1 |       |     1   (0)| 00:00:01 |   KEY |   KEY | 
    |  10 |       PARTITION RANGE SINGLE            |         |     1 |    17 |     1   (0)| 00:00:01 |   KEY |   KEY | 
    |  11 |        TABLE ACCESS BY LOCAL INDEX ROWID| MATCLO  |     1 |    17 |     1   (0)| 00:00:01 |   KEY |   KEY | 
    |  12 |         INDEX RANGE SCAN                | MATCLO2 |     1 |       |     1   (0)| 00:00:01 |   KEY |   KEY | 
    |  13 |      TABLE ACCESS BY GLOBAL INDEX ROWID | FICNEG  |     1 |    21 |     1   (0)| 00:00:01 | ROW L | ROW L | 
    |  14 |       INDEX UNIQUE SCAN                 | FICNEG1 |     1 |       |     1   (0)| 00:00:01 |       |       | 
    |  15 |     TABLE ACCESS BY GLOBAL INDEX ROWID  | FICNEG  |     1 |    29 |     1   (0)| 00:00:01 | ROW L | ROW L | 
    |  16 |      INDEX UNIQUE SCAN                  | FICNEG1 |     1 |       |     1   (0)| 00:00:01 |       |       | 
    |  17 |    TABLE ACCESS BY INDEX ROWID          | NATACF  |     1 |    14 |     1   (0)| 00:00:01 |       |       | 
    |  18 |     INDEX UNIQUE SCAN                   | NATACF1 |     1 |       |     1   (0)| 00:00:01 |       |       | 
    -------------------------------------------------------------------------------------------------------------------
    Pourquoi ce pb s'est il posé? pourquoi dans le premier plan d'execution fait-il un produit cartesien ? pourquoi la session reste en attente sur l'événement LATCH cache Buffer chains ? Est-ce dû à des statistiques fausses? faut-il augmenter le degré du dynamic_sampling?

    je dois fournir une explication au client et là je n'en ai pas vraiment.

    merci de votre aide

  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
    Apparemment dans un cas il utilise l'index global et parcourt toutes les partitions contre l'utilisation de l'index local dans le deuxième cas.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 750
    Par défaut
    Quel rapport avec l'evenement d'attente Latch cache buffer chains?
    pourquoi fait il un produit cartesien s'il parcourt toutes les partitions ?

  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
    c'est pas un produit cartesian, c'est juste une méthode de rapprochement de 2 FULL INDEX. Par contre comme tu parcours tous les blocs de l'index ça fait pas mal de bloc en mémoire à charger/décharger

  5. #5
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    Si vous êtes absolument sûr que la requête est complètement bloquée dans un cas, alors c'est forcément un bug.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 750
    Par défaut
    Citation Envoyé par pifor Voir le message
    Si vous êtes absolument sûr que la requête est complètement bloquée dans un cas, alors c'est forcément un bug.
    un bug oracle?

  7. #7
    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
    Citation Envoyé par pifor Voir le message
    Si vous êtes absolument sûr que la requête est complètement bloquée dans un cas, alors c'est forcément un bug.
    Je ne vois pas pourquoi ? Si dans le deuxième cas, il limite le nombre de partitions parcourus c'est forcément moins bloquant

    Les stats sont bien à jour ?

    Déjà l'IFS n'est peut-être pas pertinent, faudrait essayer un FULL TABLE SCAN dans ce cas

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 750
    Par défaut
    Citation Envoyé par orafrance Voir le message
    c'est pas un produit cartesian, c'est juste une méthode de rapprochement de 2 FULL INDEX. Par contre comme tu parcours tous les blocs de l'index ça fait pas mal de bloc en mémoire à charger/décharger
    Sur ORAfaq on me dit qu'il fait bien un produit cartesien car l'Optimiseur part du principe que le full index scan ne lui retournera qu'une seule ligne, et donc un produit cartesien avec une seule ligne d'un côté n'est pas du tout couteux

Discussions similaires

  1. [PDO] General error: 2031 sur une requête qui marche avec PHPMyAdmin
    Par laurentSc dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 14/12/2015, 13h17
  2. Réponses: 6
    Dernier message: 23/07/2010, 10h24
  3. Comment interdire l'utilisation des MERGE JOIN CARTESIAN par le CBO ?
    Par farenheiit dans le forum Administration
    Réponses: 3
    Dernier message: 15/09/2009, 10h16
  4. [SSIS] [2K5] probleme avec Merge Join
    Par aqavach dans le forum SSIS
    Réponses: 1
    Dernier message: 10/06/2009, 10h36
  5. [MySQL] requête qui marche avec phpmyadmin mais pas en php
    Par KoosMos dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 11/02/2008, 11h00

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