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 :

Temps de traitement lent avec l'opérateur in


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 9
    Points : 10
    Points
    10
    Par défaut Temps de traitement lent avec l'opérateur in
    Bonjour a tous ,

    ma question est simple : je fais un simple select sur une vue oracle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from ma_vue where id in (la liste de mes ids);
    sachant que ma liste d'ids contient 100 valeurs. le probleme que je rencontre seulement depuis aujourd'hui c'est un temps de traitement dépassant 4 minutes pour ce select !!
    sachant que je suis sur base oracle et que j'utilise un client oracle ainsi que OCI pour l'execution de mes requetes.
    j'aimerais savoir pourquoi l'utilisation de l'operateur IN rend le traitement lent ?
    j'ai rencontré le meme probleme sur une requete similaire : ou j'ai remplacé le IN par un NOT IN (car pour le coup c'etait possible), puis ma requete marche bien.
    pour ce deuxième cas je ne peux pas inverser car le nombre d'ids dans la base dépasse le million.

    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par vivabarça Voir le message
    j'aimerais savoir pourquoi l'utilisation de l'operateur IN rend le traitement lent ?
    Soumettez votre requête à un EXPLAIN PLAN et regardez comment sont utilisés les index.
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 9
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par fsmrel Voir le message
    Soumettez votre requête à un EXPLAIN PLAN et regardez comment sont utilisés les index.
    Bonsoir,

    d'abord merci pour votre réponse.
    ne connaissant pas EXPLAIN PLAN je voudrais savoir juste comment et pourquoi l'utiliser dans mon cas ? (surtout pourquoi).
    sachant que quand j'execute la requete sous sqldeveloper : le temps de réponse est inferieur a 2 secondes, quel est le probleme qui peut etre a l'origine de cette lenteur inexpliquée quand ma requete est envoyé via un script php au serveur ?

    Merci

  4. #4
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2014
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2014
    Messages : 37
    Points : 74
    Points
    74
    Par défaut
    Bonjour,

    pour utiliser un explain plan, la démarche est explique ici. La doc oracle, pour plus d'explication est ici.

    Un explain plan permet de savoir comment Oracle va exécuter votre requête par une estimation des coûts.

    Dans votre cas, il n'est pas normal qu'une requête vous prenne 2 seconde sur un outil et beaucoup plus longtemps sur un autre. La première question que je me poserais, c'est combien de lignes sont renvoyé par la requête (si c'est 10 millions, votre requête est bonne, c'est certainement votre réseau qui trinque)
    Pour les messages utiles, mettre un pouce vert fait plaisir à celui qui donne de son temps pour aider. (en tout cas, ça me fait plaisir)

  5. #5
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Pour compléter au plan général quant au rôle d'EXPLAIN :

    Quand vous codez une instruction SELECT, vous êtes au stade du QUOI, vous ne dites pas COMMENT les tables seront accédées. C’est l’optimiseur du SGBD qui s’en chargera, en fonction notamment de la volumétrie des tables et des turbos (les index) branchés sur ces tables. Quand une requête se traîne, c’est bien souvent parce qu’un index qui va bien est absent. Pour en avoir le cœur net, vous demandez au SGBD d’expliquer la stratégie qu’il a mise en œuvre, comment il procède pour fournir le résultat du SELECT. Pour peu qu’il dise qu’il effectue des produits cartésiens, ça explique bien des choses. L’optimiseur s’explique quand on code :

    EXPLAIN PLAN FOR SELECT xxx

    Où xxx représente le corps de votre SELECT.
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  6. #6
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 053
    Points : 9 392
    Points
    9 392
    Par défaut
    Dans SQLDevelopper, tu as le champs de saisie, où tu saisis ta requête.
    Au dessus de ce champs de saisise, tu as un bouton-image, avec un triangle vert, pour exécuter la requête.
    A droite de ce bouton, tu as 2 autres boutons. L'un des 2 permet de lancer le fameux 'Explain plan'.

    Ceci étant , in ( ) suivi d'une liste de 100 valeurs est toujours lent.
    Personnellement, j'ai renoncé à ce type de requête.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 9
    Points : 10
    Points
    10
    Par défaut
    @tous :

    Merci beaucoup pour vos réponses, je vais voir ça dès demain et je reviens vers vous pour vous dire que j'ai solutionné le problème "j'espère"

    Bonne soirée

  8. #8
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 9
    Points : 10
    Points
    10
    Par défaut
    [QUOTE=vivabarça;8037934]@tous :

    Bonjour,

    comme convenu hier, j'ai effectué un EXPLAIN PLAN de ma requete, que j'ai montré a une personne connaissant oracle (dans mon equipe) et il ne trouve rien d'alarmant dans ce plan.
    je suis revenu sur mon script pour relever le temps d'execution a l'entrée et a la sortie du script, puis au fur et a mesure j'affinais la prise de temps dans le script jusqu'a ce que j'ai trouvé la ligne qui provoque la lenteur de l'execution :
    il s'agit de : oci_execute ($select); ou $select est la variable qui contient ma requete et la connection utilisée pour se connecter a la base.
    je ne trouve rien sur internet sur ce type de probleme, donc si quelqu'un a une idée je suis preneur.

    Merci d'avance

  9. #9
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Bonsoir vivabarça,


    C'est très bien d'avoir fait un EXPLAIN, au moins vous avez pu juger que la requête en tant que telle n’était pas responsable. Maintenant pour ce qui concerne oci_execute ($select); c’est du PHP, ça sort de mon domaine, désolé...
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  10. #10
    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
    L’instruction PHP oci_execute ne peut pas faire grand-chose d'autre que d’appeler la fonction d’interface OCI d’Oracle OCISTMTExecute. Donc vous voilà revenu à la case départ : une fonctionnalité de votre application est lente mais vous ne savez pas pourquoi ; est-ce dû au réseau, au serveur PHP, au serveur de base des données, ou autre ?
    Dans ce cas le démarche à suivre est « simple » : commencez par apprendre ce qui se passe ! Il y en a plusieurs façons de faire. Dans le meilleur de cas votre application devrait vous permettre d’activer une trace SQL étendue ce qui vous permettra de tracer au niveau de la base des données ce qui se passe.

    D'autre part, les informations que vous donnez sont trop génériques pour que vous puissiez avoir d'autres réponses que cellesux s’approchant des croyances mystiques « ma requête de type select * from ma vue where colonne in (1,2,3 … 100) est lente ; bah oui Oracle est lent quand il fait In avec 100 valeurs je ne le fait plus, mais je ne sais pas pourquoi».
    Un plan d’exécution obtenu avec explain plan peut être parfois trompeur et ne pas correspondre à la réalité de l’exécution de la requête. Cherchez sur ce forum des réponses à d'autres problèmes d’optimisation pour trouver la démarche à suivre pour obtenir des informations nécessaires à la compréhension du plan d’exécution réel de la requête.

Discussions similaires

  1. Réponses: 0
    Dernier message: 14/04/2015, 10h34
  2. [11g] Temps de traitement avec dblink
    Par morocoboy dans le forum Administration
    Réponses: 6
    Dernier message: 21/10/2013, 12h09
  3. [MySQL] Temps de traitement avec phpMyAdmin
    Par ratatam25 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 09/04/2009, 21h03
  4. [Struts] pb avec l'opérateur '/'
    Par njac dans le forum Struts 1
    Réponses: 6
    Dernier message: 29/06/2004, 12h19
  5. optimisation de temps de traitement xml/xslt
    Par Erwy dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 06/05/2004, 16h08

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