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 :

[Optimisation] Requête SELECT conséquente


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    160
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Novembre 2003
    Messages : 160
    Points : 89
    Points
    89
    Par défaut [Optimisation] Requête SELECT conséquente
    Bonjour à tous,

    Maitrisant les bases des rouages SQL, mais assez peu l'optimisation des temps de requêtes, je viens vers vous pour avoir un peu d'aide sur le sujet. Il se peut que la source de mon problème ne soit pas le SQL mais plutôt Oracle, auquel cas mon post ne figure pas dans le bon forum

    J'ai besoin de ramener 160 lignes de ma base de données (dans un cas pessimiste, le nombre de lignes est cet ordre là). Pour info, maTable contient environ 1 120 000 lignes. Je fais donc un select de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * FROM maTable WHERE monChamp IN (*liste des 157 valeurs*);
    Problème : la requête met 50sec à s'exécuter. Je tiens à signaler que monChamp est indexé. J'ai préféré faire une seule et grosse requête pour éviter les aller retours inutiles entre mon client et ma base.

    - Avez-vous une idée d'amélioration d'un point de vue SQL ? (sous découpage en plusieurs requêtes?)
    - Le problème se situe-t-il ailleurs?
    - Si oui, avez-vous une idée d'amélioration autre?

    Merci d'avance pour vos lumières !

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Bonjour,

    En effet, votre post serait plus à sa place dans le forum consacré à Oracle.

    Quelle est la structure de votre table, en particulier le type de la colonne indexée?
    Avez vous consulté le plan d'exécution de la requête?
    Les stats sont-elles à jour?
    Vous dites ramener 160 lignes maximum, la colonne de recherche est-elle clé primaire, ou a-t-elle une contrainte d'unicité?
    Comment est construite la liste de valeur?

  3. #3
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    Les statistiques sont-elles à jour ?
    Il faut le plan d'exécution.

    Explication rapide :
    Pour choisir le bon plan d'exécution, le Cost Based Optimizer (CBO) a besoin de se faire une idée de ce qu'il y a dans ta table : c'est ce qu'on appelle les statistiques.
    Par exemple, si jamais la liste de 157 valeurs te renvoie 200 000 lignes, il se peut fortement qu'il soit plus rapide de lire toute la table.
    Et si l'optimiseur ne sait pas que la requête doit renvoyer 157 lignes, il donne une valeur arbitraire...

    Tu peux faire la petite requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT last_analyzed 
    FROM dba_tables
    WHERE table_name = upper('maTable')
    Pareil pour les indexes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT index_name, last_analyzed 
    FROM dba_indexes
    WHERE table_name = upper('maTable')
    Ensuite, le plan d'exécution confirmera si la table est lue en entier ou non.

    Utilise SQL*Plus, et fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    EXPLAIN PLAN FOR
    TaRequete
    /
     
    SELECT * 
    FROM table(dbms_xplan.display)
    /

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

Discussions similaires

  1. Réponses: 3
    Dernier message: 14/09/2010, 12h45
  2. Optimisation requête SELECT - IN clause
    Par L'horla dans le forum Requêtes
    Réponses: 0
    Dernier message: 04/05/2010, 15h54
  3. [MySQL] Optimisation requête SELECT
    Par GyZmoO dans le forum Requêtes
    Réponses: 3
    Dernier message: 22/10/2009, 17h24
  4. Optimisation d'une requête SELECT
    Par orus8 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 19/10/2007, 10h08
  5. Optimisations mysql sur les requêtes SELECT: index
    Par leo'z dans le forum Débuter
    Réponses: 2
    Dernier message: 29/11/2003, 13h23

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