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 :

Requête trés lente


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    276
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 276
    Par défaut Requête trés lente
    Bonjour,
    J'ai exécuté la requête sur une base de données Oracle 10g XE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select a_p.* from oph_patient a_p where ( (upper(c_nom) like upper(('m%'))) and (c_deces = ('0')) ) order by upper(c_nom), upper(c_prenom)
    Le problème c'est qu'elle met presque 10 secondes pour afficher les résultats (presque 6500 enregistrements).
    Sachant que la colonne c_nom est de type varchar(150), que j'ai crée un index sur la colonne c_nom et que le nombre de colonne retourné par la requête est 62.
    J'ai essayé d'utiliser les hint oracle PARALLEL et ALL_ROWS mais ça n'a rien changé.
    Est ce que quelqu'un pourrait me dire comment je dois faire pour minimiser le temps d'exécution de la requête.
    Bien cordialement.

  2. #2
    Membre émérite Avatar de Z3phur
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2007
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2007
    Messages : 680
    Par défaut
    bonjour,

    peux-tu nous mettre le plan d'exécution. De plus il faut que tu crées un index sur upper(c_nom) et nom pas sur c_nom si tu veux utiliser l'index.

  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
    T'es fan des parenthèses, non ?

    A partir du moment où tu mets une fonction sur une colonne indexée, Oracle ne peut pas utiliser l'index (sauf si tu crées un index de fonction).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT a_p.* 
    FROM OPH_PATIENT a_p 
    WHERE UPPER(c_nom) LIKE UPPER('m%') 
    AND c_deces = '0'
    ORDER BY UPPER(c_nom), UPPER(c_prenom)
    Pour prendre l'index sur c_nom, il faut créer un index de fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE INDEX OPH_PATIENT_NOM ON OPH_PATIENT (UPPER(c_nom))

  4. #4
    Membre émérite Avatar de Z3phur
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2007
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2007
    Messages : 680
    Par défaut
    Citation Envoyé par McM Voir le message
    T'es fan des parenthèses, non ?


  5. #5
    Membre Expert Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Par défaut
    De plus si c_deces est un nombre alors il vaut mieux écrire :

    Ce ne serait pas mieux d'avoir ?


  6. #6
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    276
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 276
    Par défaut
    Merci pour vos réponses. En fait, j'ai récupéré le code source d'une application qui crée la requête dynamiquement. Ceci a causé ce nombre de parenthèse.
    Je vous transmet le plan d'exécution de la requête allégée des parenthèse inutiles et avec l'index crée :
    6329 ligne(s) sÚlectionnÚe(s).
    
    
    Plan d'exécution
    ----------------------------------------------------------
    Plan hash value: 2508398185
    
    ------------------------------------------------------------------------------------------
    | Id  | Operation          | Name        | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
    ------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT   |             |  5754 |    61M|       | 13979   (1)| 00:02:48 |
    |   1 |  SORT ORDER BY     |             |  5754 |    61M|    89M| 13979   (1)| 00:02:48 |
    |*  2 |   TABLE ACCESS FULL| OPH_PATIENT |  5754 |    61M|       |   562   (3)| 00:00:07 |
    ------------------------------------------------------------------------------------------
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    
       2 - filter("C_DECES"=0 AND UPPER("C_NOM") LIKE 'M%')
    
    Note
    -----
       - dynamic sampling used for this statement
    
    
    Statistiques
    ----------------------------------------------------------
              0  recursive calls
              0  db block gets
           2018  consistent gets
              0  physical reads
              0  redo size
         882767  bytes sent via SQL*Net to client
           5011  bytes received via SQL*Net from client
            423  SQL*Net roundtrips to/from client
              1  sorts (memory)
              0  sorts (disk)
           6329  rows processed

  7. #7
    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
    Quels sont les index créés sur la table ?
    Les stats sont à jour ?

  8. #8
    Membre Expert

    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    536
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 536
    Par défaut
    Citation Envoyé par McM Voir le message
    Quels sont les index créés sur la table ?
    Les stats sont à jour ?
    Si les statistiques étaient à jour le dynamic sampling n'aurait pas été utilisé

  9. #9
    Membre Expert Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Par défaut
    De plus il me semble qu'il vaut mieux détailler les colonnes que tu souhaites plutôt que mettre *

  10. #10
    Membre émérite Avatar de Z3phur
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2007
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2007
    Messages : 680
    Par défaut
    Bonjour,

    tu as du faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where upper(c_nom) like 'M%'
    essaie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where upper(c_nom) like upper('m%')
    et poste nous à nouveau le plan d'exécution.

Discussions similaires

  1. [AC-2003] Requête très lente
    Par liop49 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 13/06/2013, 14h05
  2. Requête trés lente > 20min
    Par ahmed. dans le forum Requêtes
    Réponses: 3
    Dernier message: 21/01/2013, 17h41
  3. [AC-2007] Requête très lente depuis table externe en BD SQLServer2008
    Par alfhcg dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 28/10/2011, 00h19
  4. Requête très lente
    Par Korben-Dallas dans le forum Requêtes
    Réponses: 10
    Dernier message: 20/07/2011, 14h07
  5. Requêtes très lentes malgré peu de données
    Par The zxeno prophet dans le forum Requêtes
    Réponses: 8
    Dernier message: 12/01/2011, 14h09

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