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 :

Comment éviter un FULL SCAN au niveau d'une sous requete


Sujet :

Administration Oracle

  1. #1
    Membre averti
    Avatar de ora_home
    Homme Profil pro
    Consultant Oracle
    Inscrit en
    Février 2009
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Consultant Oracle
    Secteur : Finance

    Informations forums :
    Inscription : Février 2009
    Messages : 103
    Points : 376
    Points
    376
    Par défaut Comment éviter un FULL SCAN au niveau d'une sous requete
    Bonjour,
    Je suis entrain de jongler avec quelques requêtes pour voir le comportement du noyau ORACLE. (Version 10gR2)

    J'en ai 2 tables ( T et TT) les deux ont la même structure que la table system DBA_OBJECTS.
    La table T contiens 4044160 enregistrement
    La table TT contiens 1011040 enregistrement.

    La requete que je fait dans mes tests est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     SELECT COUNT(*) FROM tt
     WHERE EXISTS 
            (SELECT 'X' FROM t WHERE t.owner = tt.owner
            AND t.SUBOBJECT_NAME = tt.SUBOBJECT_NAME
            AND t.OBJECT_NAME = tt.OBJECT_NAME    
            AND t.OBJECT_TYPE = tt.OBJECT_TYPE  );
    Cas N1 : J'ai crée un l'index suivant sur la table T:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE INDEX idx_t ON T (OWNER,OBJECT_NAME,SUBOBJECT_NAME,OBJECT_TYPE)
    Et le plan d'exécution que j'ai eu dans ce cas 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    Plan d'exécution ( avec index CREATE INDEX idx_t ON T (OWNER,OBJECT_NAME,SUBOBJECT_NAME,OBJECT_TYPE))
    ----------------------------------------------------------
    Plan hash value: 194536945
     
    ----------------------------------------------------------------------------------------
    | Id  | Operation            | Name    | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
    ----------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT     |         |     1 |   222 |       | 48517   (2)| 00:09:43 |
    |   1 |  SORT AGGREGATE      |         |     1 |   222 |       |            |          |
    |*  2 |   HASH JOIN SEMI     |         |     1 |   222 |   138M| 48517   (2)| 00:09:43 |
    |   3 |    TABLE ACCESS FULL | TT      |  1178K|   124M|       |  3107   (3)| 00:00:38 |
    |   4 |    VIEW              | VW_SQ_1 |  4462K|   472M|       | 12371   (3)| 00:02:29 |
    |   5 |     TABLE ACCESS FULL| T       |  4462K|   472M|       | 12371   (3)| 00:02:29 |
    ----------------------------------------------------------------------------------------
     
    Predicate Information (identified by operation id):
    ---------------------------------------------------
     
       2 - access("OWNER"="TT"."OWNER" AND "OBJECT_NAME"="TT"."OBJECT_NAME" AND
                  "SUBOBJECT_NAME"="TT"."SUBOBJECT_NAME" AND "OBJECT_TYPE"="TT"."OBJECT_TYPE")
     
    Note
    -----
       - dynamic sampling used for this statement
     
     
    Statistiques
    ----------------------------------------------------------
           1037  recursive calls
              0  db block gets
          15247  consistent gets
          15058  physical reads
              0  redo size
            421  bytes sent via SQL*Net to client
            396  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
             12  sorts (memory)
              0  sorts (disk)
              1  rows processed
    Cas N° 2 : J'ai crée le même index sur la table TT
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE INDEX idx_tt ON TT (OWNER,OBJECT_NAME,SUBOBJECT_NAME,OBJECT_TYPE)
    Et le plan d'exécution que j'ai eu dans ce cas 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    Plan d'exécution ( avec idx_t  et idx_tt)
    ----------------------------------------------------------
    Plan hash value: 1217498393
     
    ------------------------------------------------------------------------------------------
    | Id  | Operation              | Name    | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
    ------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT       |         |     1 |   222 |       | 47016   (2)| 00:09:25 |
    |   1 |  SORT AGGREGATE        |         |     1 |   222 |       |            |          |
    |*  2 |   HASH JOIN SEMI       |         |     1 |   222 |   138M| 47016   (2)| 00:09:25 |
    |   3 |    INDEX FAST FULL SCAN| IDX_TT  |  1178K|   124M|       |  1607   (2)| 00:00:20 |
    |   4 |    VIEW                | VW_SQ_1 |  4462K|   472M|       | 12371   (3)| 00:02:29 |
    |   5 |     TABLE ACCESS FULL  | T       |  4462K|   472M|       | 12371   (3)| 00:02:29 |
    ------------------------------------------------------------------------------------------
     
    Predicate Information (identified by operation id):
    ---------------------------------------------------
     
       2 - access("OWNER"="TT"."OWNER" AND "OBJECT_NAME"="TT"."OBJECT_NAME" AND
                  "SUBOBJECT_NAME"="TT"."SUBOBJECT_NAME" AND "OBJECT_TYPE"="TT"."OBJECT_TYPE")
     
    Note
    -----
       - dynamic sampling used for this statement
     
     
    Statistiques
    ----------------------------------------------------------
            686  recursive calls
              0  db block gets
           8529  consistent gets
           8892  physical reads
              0  redo size
            421  bytes sent via SQL*Net to client
            396  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
              8  sorts (memory)
              0  sorts (disk)
              1  rows processed
    Ma question est comment faire pour que le CBO évite un FULL SCAN au niveau de la Table (T) de la sous-requete et passe par son index idx_t ??

  2. #2
    Membre expérimenté Avatar de ojo77
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2010
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 680
    Points : 1 597
    Points
    1 597
    Par défaut
    Bonjour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT COUNT(*) FROM tt
     WHERE EXISTS 
            (SELECT t.owner  FROM t WHERE t.owner = tt.owner
            AND t.SUBOBJECT_NAME = tt.SUBOBJECT_NAME
            AND t.OBJECT_NAME = tt.OBJECT_NAME    
            AND t.OBJECT_TYPE = tt.OBJECT_TYPE  );
    Ca doit le faire sous les conditions que la table T a un nombre de blocs supérieur à celui lu par le dynamic sampling.

    Vous pouvez aussi calculer vos stats, c'est pas mal pour influer positivement sur le CBO

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/11/2014, 10h47
  2. Utilisation du statement %scan au niveau d'une macro
    Par SASMetrics dans le forum Macro
    Réponses: 2
    Dernier message: 01/02/2010, 17h16
  3. Réponses: 1
    Dernier message: 04/11/2009, 00h39
  4. Comment integrer une sous requete?
    Par grimat dans le forum Langage SQL
    Réponses: 2
    Dernier message: 03/05/2008, 16h07
  5. Réponses: 15
    Dernier message: 14/04/2006, 15h34

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