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 :

Est-il possible d'utiliser un index précis dans une requète sql en 10g?


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2005
    Messages : 55
    Points : 61
    Points
    61
    Par défaut Est-il possible d'utiliser un index précis dans une requète sql en 10g?
    Oracle Database 10g Enterprise Edition Release 10.2.0.2.0

    Bonjour,

    J'ai une table d'affectation possédant une date de début.
    j'ai creé un index 'TEST' sur cette date.(Un index avec la fonction TRUNC(start_date))

    Lorsque j'effectue la requète suivante, voici le résultat de l'explain plan:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select a.*
    from P_ASSIGNMENTS a
    where TRUNC(start_date) = TRUNC(TO_DATE('18/09/1997','DD/MM/YYYY'))
     
    Operation	                          Object Name	 Rows   Bytes   Cost
    SELECT STATEMENT Optimizer Mode=ALL_ROWS		 127  	 	38  	 	      	             	 
      TABLE ACCESS BY INDEX ROWID	          P_ASSIGNMENTS	 127  	10 K	38  	 	      	             	 
        INDEX RANGE SCAN	                  TEST	         51
    On utilise bien l'index.
    J'aurais bien aimé savoir si avec la requète suivante, il est possible de faire référence à cet index.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select a.*
    from P_ASSIGNMENTS a
    where TRUNC(start_date) = (select max(a1.start_date)
      	  		 from p_assignments a1
    			 where a1.person_id = a.person_id 
    			    and a1.sequence = a.sequence
    			    and a1.end_date is null)
    Car pour le moment, il construit la "vue temporaire" et fait un table acces full sur P_ASSIGNMENT a.

    Merci d'avance.

  2. #2
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    0. La 2nde requête est-elle lente ? Si elle ne rame pas, on ne tune pas.
    1. Quel est le plan d'exécution de la 2nde requête ?
    2. Les stats sont-elles à jours ? Sont-elles calculées avec des histogrammes ?
    3. Pourquoi ne pas utiliser HAVING ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2005
    Messages : 55
    Points : 61
    Points
    61
    Par défaut
    Non , pour le moment elle ne rame pas de trop, mais il n'y a que 12680 tuples dans cette table et elle est destinée à en recevoir bcps plus à l'avenir.

    Donc je me demandais comment améliorer les perf.

    Voici le plan de la seconde requète:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Operation	                          Object Name	     Rows	Bytes	Cost
     
    SELECT STATEMENT Optimizer Mode=ALL_ROWS		     22  	 	60  	 	      	             	 
      HASH JOIN		                                     22  	 2 K	60  	 	      	             	 
        VIEW	                          SYS.VW_SQ_1	      2 K	73 K	17  	 	      	             	 
          HASH GROUP BY		                              2 K	65 K	17  	 	      	             	 
            INDEX FAST FULL SCAN	          P_ASSIGN_PE_IDX     2 K	65 K	16  	 	      	             	 
        TABLE ACCESS FULL	                  P_ASSIGNMENTS	     12 K	 1 M	42
    Pour ce qui est des stats j'ai executé une commande de dbms_stat pour mettre a jour toutes les stats du shemas ,pour la manière de les calculer, je ne sais vraiment pas comment elles le sont.

    Et pour la Clause Having, je ne vois pas comment l'utiliser à part dans un group by.

  4. #4
    Membre éprouvé Avatar de 13thFloor
    Homme Profil pro
    DBA Oracle freelance
    Inscrit en
    Janvier 2005
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : DBA Oracle freelance

    Informations forums :
    Inscription : Janvier 2005
    Messages : 670
    Points : 945
    Points
    945
    Par défaut
    C'est surtout le nombre de blocs qui intéresse l'optimiseur, pas le nb de lignes.
    L'optimiseur a jugé plus performant de faire un fts plutôt que de lire blocs d'index+blocs de tables.
    Si tu veux réellement utiliser, place un hint dans la requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT /*+ index(a,test) */ a.*
    Si tu veux vérifier que ta requête utiliseras ton index quand il y aura davantage de volume, positionnes les stats à des valeurs importantes (en blocs notamment).

  5. #5
    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
    Attention :

    TRUNC(start_date) fonction sur la colonne l'index sur start_date ne peut pas être utilisé. Il faut un index de fonction

    Edit : oublie ce que je dis, j'avais pas bien lu

    Par contre, je t'invite à utiliser une fonction analytique qui t'évitera d'utiliser 2 fois la table

  6. #6
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    pas de problèmes de perf => pas de hint !

  7. #7
    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
    +1 12000 lignes, donc le FULL est probablement plus performant.

    C'est tout l'intérêt des stats, le CBO sait s'adapter en fonction de la volumétrie

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2005
    Messages : 55
    Points : 61
    Points
    61
    Par défaut
    Ok merci beaucoup.

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

Discussions similaires

  1. Est-il possible d'utiliser la condition "inclus dans" dans VBA ?
    Par wyzer dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 11/05/2011, 11h18
  2. Réponses: 2
    Dernier message: 18/12/2010, 21h31
  3. Réponses: 4
    Dernier message: 05/12/2010, 21h30
  4. Réponses: 7
    Dernier message: 29/01/2009, 13h52
  5. Réponses: 15
    Dernier message: 09/05/2008, 17h11

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