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

 Oracle Discussion :

Utilisation des index dans une requête


Sujet :

Oracle

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2010
    Messages : 56
    Points : 26
    Points
    26
    Par défaut Utilisation des index dans une requête
    Salut à tous !

    Je suis débutant dans l'utilisation des index et j'aimerais les utiliser pour optimiser mes requêtes SQL.
    En fait j'ai une table comportant deux colonnes : numero_serie et montant.

    Je récupère le montant dans mes Forms selon le numéro de série saisi.
    Il s'avère que je traite de gros volume d'information et la récupération du montant est très lente.
    J'aimerai savoir comment m'y prendre, j'utilise la version 10g.

    Merci pour votre aide.

  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
    Qu'avez-vous cherché et essayé ?

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2010
    Messages : 56
    Points : 26
    Points
    26
    Par défaut
    j'ai fouillé sur internet mais je n'arrive pas à comprendre les procédures à effectuer pour mesurer les performances des requêtes.
    svp un peu d'explain

  4. #4
    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
    Vous avez déjà au moins une mesure, je vous cite :
    Citation Envoyé par sanouphil
    et la récupération du montant est très lente
    Il suffit de créer un index sur numero_serie et de relancer la requête.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2010
    Messages : 56
    Points : 26
    Points
    26
    Par défaut
    j'ai crée un index comme ceci <create unique index num_serie_idx ON num_serie_montant(num_serie);> sur num_serie comme suggérer mais le temps d'exécution reste la même apparemment.sous les forms ca fait 20s 22 dans les 2 cas.
    une autre idée stp Waldar?

  6. #6
    Expert éminent
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 821
    Points : 6 443
    Points
    6 443
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Il s'avère que je traite de gros volume d'information
    Es-tu sûr de vouloir passer par un index alors ? Un index est intéressant pour accéder à un petit volume de données qui se trouvent parmi un gros volume total.
    Cordialement,
    Franck.
    Franck Pachot - Developer Advocate Yugabyte 🚀 Base de Données distribuée, open source, compatible PostgreSQL
    🗣 twitter: @FranckPachot - 📝 blog: blog.pachot.net - 🎧 podcast en français : https://anchor.fm/franckpachot

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2010
    Messages : 56
    Points : 26
    Points
    26
    Par défaut
    bonjour

    Un index est intéressant pour accéder à un petit volume de données qui se trouvent parmi un gros volume total.
    ah ca oui vous avez raison!mais avec quoi pensez vous que je puisse optimiser ce type de requête?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
         cursor cnt is
    	       select count(distinct montant) 
    	              from activation.num_serie_montant 
    	              where to_number(num_serie)  between :starting_id
    	              and  :ending_id;
    j'ai aussi l'impression que l'utilisation des curseurs ralenti le chargement.mais je ne sais pas par quoi les remplacer
    que puis je faire?

  8. #8
    Membre actif Avatar de DAB.cz
    Inscrit en
    Octobre 2006
    Messages
    221
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 221
    Points : 249
    Points
    249
    Par défaut
    pourquoi to_number(num_serie)???

  9. #9
    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
    Citation Envoyé par sanouphil Voir le message
    j'ai aussi l'impression que l'utilisation des curseurs ralenti le chargement.mais je ne sais pas par quoi les remplacer
    que puis je faire?
    C'est probable. Que faites-vous avec ce curseur ?
    Pourquoi un count(distinct) sur un montant, ça n'a aucun sens ?

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2010
    Messages : 56
    Points : 26
    Points
    26
    Par défaut
    pourquoi to_number(num_serie)???
    to_number(num_serie) parce que je convertis num_serie qui est du type varchar2(9) dans ma base de données en number pour la comparaison avec la valeur entrée dans le formulaire
    where to_number(num_serie) >=:starting_id

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2010
    Messages : 56
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par Waldar
    C'est probable. Que faites-vous avec ce curseur ?
    Pourquoi un count(distinct) sur un montant, ça n'a aucun sens ?
    en fait j'utilise ce curseur pour contrôler le nombre de montant distinct se trouvant dans la plage que va rentrer l'utilisateur.si il rentre une plage de numero de serie dans laquelle il y'a deux montant différents,j'envoie un message d'erreur sinon,je parcours les numéros de serie de a base pour voir à quel montant correspond la plage saisie par l'utilisateur afin de leur affecter le montant correspondant automatiquement.
    je me suis bien expliquée j'espère!!!
    Merci

  12. #12
    Membre actif Avatar de DAB.cz
    Inscrit en
    Octobre 2006
    Messages
    221
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 221
    Points : 249
    Points
    249
    Par défaut
    Citation Envoyé par sanouphil Voir le message
    to_number(num_serie) parce que je convertis num_serie qui est du type varchar2(9) dans ma base de données en number pour la comparaison avec la valeur entrée dans le formulaire
    Si c'est le nombre, utilise le type NUMBER!

    Mais peut-être num_serie est (toujours 9 lettres!) comme '005202465'. Alors, la condition peut fonctionner avec VARCHAR:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    variable xstart varchar2(9)
    variable xend varchar2(9)
     
    exec :xstart := '001000000'
    exec :xend := '001999999'
     
    SELECT count(DISTINCT montant) 
      FROM activation.num_serie_montant 
      WHERE num_serie BETWEEN :xtart  AND  :xend;

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2010
    Messages : 56
    Points : 26
    Points
    26
    Par défaut
    J'ai un problème avec le code.
    Excuse moi mais à quoi sert cette partie ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    exec :xstart := '001000000'
    exec :xend := '001999999'
    Parce que les données sont dynamiques. Peut-être que c'est parce que je ne connais pas le rôle du exec également.

    Merci de m'expliquer un peu.

  14. #14
    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
    Citation Envoyé par sanouphil Voir le message
    en fait j'utilise ce curseur pour contrôler le nombre de montant distinct se trouvant dans la plage que va rentrer l'utilisateur.si il rentre une plage de numero de serie dans laquelle il y'a deux montant différents,j'envoie un message d'erreur sinon,je parcours les numéros de serie de a base pour voir à quel montant correspond la plage saisie par l'utilisateur afin de leur affecter le montant correspondant automatiquement.
    je me suis bien expliquée j'espère!!!
    Merci
    Non désolé, je n'ai pas compris. Un petit exemple illustré avec quelques données peut-être ?

  15. #15
    Membre actif Avatar de DAB.cz
    Inscrit en
    Octobre 2006
    Messages
    221
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 221
    Points : 249
    Points
    249
    Par défaut
    Citation Envoyé par sanouphil Voir le message
    J'ai un problème avec le code.
    Excuse moi mais à quoi sert cette partie ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    exec :xstart := '001000000'
    exec :xend := '001999999'
    Parce que les données sont dynamiques. Peut-être que c'est parce que je ne connais pas le rôle du exec également.

    Merci de m'expliquer un peu.
    C'est juste un exemple (en SQL*Plus) où je travaille avec VARCHAR variables.
    Simplement, évite les conversions implicite et explicit (to_number) entre différents types de données.

    Et les données dynamiques? Ca veut dire quoi?

  16. #16
    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
    Essayez avec un index non pas sur num_serie mais sur to_number(serie).

    Mais effectivement votre modèle est mal conçu, si vous stockez des nombres vous devez utiliser le format NUMBER et pas VARCHAR2.

  17. #17
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2010
    Messages : 56
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par Waldar
    Non désolé, je n'ai pas compris. Un petit exemple illustré avec quelques données peut-être ?
    je t'explique:je charge des numéros de serie dans ma base par sqlldr par exemple.mais je sais à l'avance que si je prend par exemple la plage allant de 1 à 10,le montant correspondant à cette plage est de 100f par exemple et le montant correspondant à la plage de numéro de serie allant de 11 à 20 est de 200f par exemple.ainsi j'aimerai que si l'utilisateur à partir des forms,rentre une plage de numéro de serie entre 1 et 10(par exemple il rentre 1 pour le numéro de serie de départ et 5 pour la fin,qu'il affecte automatiquement 100f devant cette plage entrée) puisqu'elle est comprise entre 1 à 10 et s'il rentre pour le numéro de départ 12 et 17 pour la fin,qu'il affecte automatiquement 200f dans le champs libellé.ainsi j'utilise les curseurs pour savoir s'il n'a pas entré 1 pour le départ et 16 pour la fin .si c'est le cas il y a problème puisqu'il ne peut chargé qu'une plage correspondant à un montant à la fois.
    le curseur avec la requête parcours les montant affecté à la plage entré en comptant les montants distincts.si count(distinct montant)!=1 alors message d'erreur,sinon il affecte le libellé du montant correspondant dans le champs libellé.
    est ce plus claire?
    merci

  18. #18
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2010
    Messages : 56
    Points : 26
    Points
    26
    Par défaut
    Et les données dynamiques? Ca veut dire quoi?
    je fais allusion au fait que les xstart n'est pas forcément '001000000'
    et xend '001999999' car je récupère ce que l'utilisateur à rentré dans la forms.

  19. #19
    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
    Ok pour l'explication, mais vous n'avez jamais mentionné la colonne libellé auparavant.

    Est-elle dans la même table ?

  20. #20
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2010
    Messages : 56
    Points : 26
    Points
    26
    Par défaut
    non le champs libellé est dans aune autre table qui est la table produits avec laquelle je fais une jointure pour avoir le montant correspondant au libellé.
    thanks

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 4 1234 DernièreDernière

Discussions similaires

  1. [MySQL] Utilisation des alias dans une requête
    Par methodman225 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 29/09/2008, 12h55
  2. Utilisation des parametres dans une requéte
    Par ange_dragon dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 13/06/2007, 09h32
  3. Utiliser des "SI" dans une requête access ?
    Par shaenwe dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 14/03/2007, 12h25
  4. Comment utiliser des variables dans une requête SQL ?
    Par Ragnarok85 dans le forum Requêtes et SQL.
    Réponses: 10
    Dernier message: 12/02/2007, 16h23

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