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 :

[8i] optimisation de requete


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    283
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 283
    Points : 122
    Points
    122
    Par défaut [8i] optimisation de requete
    Bonjour,

    Je rencontre un problème avec l'utilisation d'un progiciel qui génère des requêtes de ce type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select mesures0_.MESURE_CODE as MESURE_C1_, mesures0_.MESURE_LIBELLE as
      MESURE_L2_, mesures0_.MESURE_ACTIVE as MESURE_A5_, mesures0_.ICOMMENT as
      ICOMMENT, mesures0_.MESURE_TYPE as MESURE_T4_, mesures0_.NATURE_RISQUE as
      NATURE_R6_, mesures0_.RISQUE_CODE as RISQUE_C7_
    from
     MESURES mesures0_ where (NATURE_RISQUE IS NOT NULL)AND(MESURE_LIBELLE LIKE
      'Obligation d''un triangl%')AND(RISQUE_CODE='A')
    Lorsque je fais un explain plan je constate un FTS sur la table MESURES (330.000 enregistrements) ce qui n'est pas énorme.

    Je pense que le problème vient de la clause LIKE mais je ne sais pas trop comment faire ..

    Merci pour votre aide

    Bonne fin de journée,
    Alain

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Combien de lignes doit retourner la requête ?

    Essayez de rajouter un index sur (RISQUE_CODE, MESURE_LIBELLE).

  3. #3
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Que est-ce que vous avez comme index sur la table en question ?

  4. #4
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 76
    Points : 81
    Points
    81
    Par défaut
    Ceci est aussi possible:
    Pb de perf sur des grands champs avec l'opérateur like.
    http://www.dba-oracle.com/oracle_tip..._sql_index.htm

    Voir l'article de Laurent Schneider.
    http://laurentschneider.com/wordpres...me-likebc.html

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    283
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 283
    Points : 122
    Points
    122
    Par défaut
    Bonjour,

    Merci pour vos réponse, j'ai déjà un index sur la colonne RISQUE_CODE et je pense que la réponse réside dans l'article pointé par boutade80 :

    http://www.dba-oracle.com/oracle_tip..._sql_index.htm

    Je n'ai jamais utilisé ce type d'index, je vais creuser un peu le sujet afin de savoir s'il n'y a pas d'effet de bord.

    Savoir par exemple si les requêtes doivent être réécrites car j'ai cru comprendre que l'utilisation de ce type d'index nécessitait l'utilisation du mot clef 'CONTAINS' à la place du mot clef 'LIKE'.

    Merci bien,
    Alain

  6. #6
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Like '%ABC%' n'est pas la même chose que like 'ABC%'.
    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
     
    SQL> set autotrace traceonly explain
    SQL> select * from emp where ename like 'ABC%';
     
    Plan d'exÚcution
    ----------------------------------------------------------
    Plan hash value: 2765129497
     
    --------------------------------------------------------------------------------------
     
    | Id  | Operation                   | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
     
    --------------------------------------------------------------------------------------
     
    |   0 | SELECT STATEMENT            |        |     1 |    37 |     2   (0)| 00:00:01 |
     
    |   1 |  TABLE ACCESS BY INDEX ROWID| EMP    |     1 |    37 |     2   (0)| 00:00:01 |
     
    |*  2 |   INDEX RANGE SCAN          | IX_EMP |     1 |       |     1   (0)| 00:00:01 |
     
    --------------------------------------------------------------------------------------
     
     
    Predicate Information (identified by operation id):
    ---------------------------------------------------
     
       2 - access("ENAME" LIKE 'ABC%')
           filter("ENAME" LIKE 'ABC%')
     
    SQL> select * from emp where ename like '%ABC%';
     
    Plan d'exÚcution
    ----------------------------------------------------------
    Plan hash value: 3956160932
     
    --------------------------------------------------------------------------
    | Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    --------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |      |     1 |    37 |     3   (0)| 00:00:01 |
    |*  1 |  TABLE ACCESS FULL| EMP  |     1 |    37 |     3   (0)| 00:00:01 |
    --------------------------------------------------------------------------
     
    Predicate Information (identified by operation id):
    ---------------------------------------------------
     
       1 - filter("ENAME" LIKE '%ABC%')
     
    SQL>

  7. #7
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Le test de la non nullité dans la clause where empêche toute utilisation d'un index, d'ou le FTS.
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  8. #8
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par SheikYerbouti Voir le message
    Le test de la non nullité dans la clause where empêche toute utilisation d'un index, d'ou le FTS.
    Salut @ SheikYerbouti
    Déjà, je ne vois pas dans ce cas comment ta remarque s’applique; à priori la colonne testée avec NOT NULL n’est pas indexée.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 331
    Points : 394
    Points
    394
    Par défaut
    Le test de non nullité empêchera certainement d'utiliser des indexes référençant la colonne "NATURE_RISQUE", mais je ne vois pas pourquoi la requête n'utilisera pas des indexes sur les autres colonnes.
    Sinon,
    Je crois que l'index sur la colonne "RISQUE_CODE" n'est pas assez sélectif.
    Ta colonne "MESURE_LIBELLE" est indexée?

    Merci de poster le résultat de cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT index_name, column_name, column_position FROM user_ind_columns WHERE table_name = 'MESURES' ORDER BY 1,3
    Rachid A.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 331
    Points : 394
    Points
    394
    Par défaut
    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
    SQL> set autotrace traceonly explain stat
    SQL> 
    SQL> select * from muse where muse_date is not null and id = 11942;
     
    Elapsed: 00:00:00.01
     
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 3518730075
     
    --------------------------------------------------------------------------------------
    | Id  | Operation                   | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
    --------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT            |        |     1 |    18 |     4   (0)| 00:00:01 |
    |*  1 |  TABLE ACCESS BY INDEX ROWID| MUSE   |     1 |    18 |     4   (0)| 00:00:01 |
    |*  2 |   INDEX RANGE SCAN          | ID_IDX |     1 |       |     3   (0)| 00:00:01 |
    --------------------------------------------------------------------------------------
    Rachid A.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 331
    Points : 394
    Points
    394
    Par défaut
    Désolé, le message auquel j'ai répondu a disparu entre-temps

    Rachid A.

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    283
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 283
    Points : 122
    Points
    122
    Par défaut
    Je viens de créer un index sur la colonne MESURE_LIBELLE type btree mais je ne vois pas vraiment de différence en terme de temps de réponse entre le FTS et le passage par l'index.

    Il faut que je puisse tester au travers du progiciel.

    J'indiquerai le résultat des tests la semaine prochaine.

    Merci pour vos réponses

    Bon week à tous,
    Alain

Discussions similaires

  1. Optimisation de requete
    Par Scorff dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 11/07/2005, 09h59
  2. [sgbd]Optimisation des requetes Oracle/Perl
    Par linou dans le forum SGBD
    Réponses: 7
    Dernier message: 30/06/2005, 18h09
  3. Optimiser une Requetes SQL sous ASP
    Par NeHuS dans le forum ASP
    Réponses: 8
    Dernier message: 18/04/2005, 16h26
  4. Optimisation de requete
    Par cyril dans le forum SQL
    Réponses: 3
    Dernier message: 09/10/2003, 08h57
  5. Optimisation des requetes
    Par bifidus dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 06/10/2003, 11h29

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