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] En terme de rapidité


Sujet :

SQL Oracle

  1. #1
    Inactif   Avatar de Deallyra
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    1 997
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 1 997
    Points : 1 769
    Points
    1 769
    Par défaut [optimisation] En terme de rapidité
    Bonsoir,

    J'aurais voulu savoir s'il était possible de savoir le temps que mettait une requête à se faire sous Oracle.

    En fait, j'aimerai faire des tests me permettant de savoir si une requête est plus rapide qu'une autre.

    J'ai les deux requêtes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT nome, embauche
    FROM li.employes
    WHERE salaire = (
    			SELECT salaire 
    			FROM li.employes 
    			WHERE noe = '&1'
    			) 
    AND indem NOT IN (
    			SELECT indem 
    			FROM li.employes 
    			WHERE noe = '&1'
    			 );
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT NOME, EMBAUCHE
    FROM li.employes a
    WHERE SALAIRE = ( 
    				SELECT SALAIRE 
    				FROM li.employes b 
    				WHERE NOE = &1 
    				AND a.INDEM <> b.INDEM 
    			);
    J'aimerai savoir laquelle de ces deux requêtes est là plus rapide.

    Dans quel cas ? (Est ce qu'à partir d'un certain nombre d'enregistrements, une requête est préférable à l'autre? )

    Merci à vous :3
    *Si la réponse vous convient, n'oubliez pas le tag
    *Exprimez vous dans un français correct; on prend le temps de vous lire, prenez le temps de bien écrire.
    *Et comment on interprète votre code? N'oubliez pas la balise!

    *Pour une mise en page simple avec des divs.
    *Pour faire des formulaires xHTML CSS.

  2. #2
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 38
    Points : 47
    Points
    47
    Par défaut
    Bonsoir
    Pour le temps d'execution, hormis la mesure empirique je ne vois pas
    Sinon le plan d'execution me semble une bonne méthode pour comparer deux requetes, plan d'execution qui met en valeur le cout en accès. Valeur qui permet d'approcher le temps d'execution prévisionnelle de la requete.
    Pas mieux pour le moment désolé

  3. #3
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 324
    Points
    4 324
    Par défaut
    Bonjour,

    Pour ma part je dirais la seconde.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT nome, embauche
    FROM li.employes
    WHERE salaire = (
    			SELECT salaire 
    			FROM li.employes 
    			WHERE noe = '&1'
    			) 
    AND indem NOT IN (
    			SELECT indem 
    			FROM li.employes 
    			WHERE noe = '&1'
    			 );
    Ici le SGBD est obligé d'effectuer 3 sélections, et soustraire un ensemble a un autre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT NOME, EMBAUCHE
    FROM li.employes a
    WHERE SALAIRE = ( 
    				SELECT SALAIRE 
    				FROM li.employes b 
    				WHERE NOE = &1 
    				AND a.INDEM <> b.INDEM 
    			);
    Ici le SGBD effectue toujours 3 sélections, mais c'est tout.
    Je dirais donc que l'écart entre les deux requêtes aurait tendance à s'accentuer, je ne suis cependant pas expert Oracle et je peux me tromper.

    Concernant le plan d'exécution, ce n'est pas ce qui prend le plus de ressource, puisqu'il est calculé puis mis en cache. Avec une utilisation intelligente du SGBD, le cache sera utilisé la fois suivante.
    http://alaindefrance.wordpress.com
    Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
    SDE at BitTitan

  4. #4
    Inactif   Avatar de Deallyra
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    1 997
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 1 997
    Points : 1 769
    Points
    1 769
    Par défaut
    Le problème de la seconde est qu'il s'agit d'une requête corrélée...

    J'ai peur qu'avec un nombre d'enregistrement important, elle ne tienne plus la route.

    Apparemment avec "Set Timing On;" je devrai pouvoir lui demander de m'afficher le temps mit pour l'exécution de la requête...

    Je vous tiens au courant
    *Si la réponse vous convient, n'oubliez pas le tag
    *Exprimez vous dans un français correct; on prend le temps de vous lire, prenez le temps de bien écrire.
    *Et comment on interprète votre code? N'oubliez pas la balise!

    *Pour une mise en page simple avec des divs.
    *Pour faire des formulaires xHTML CSS.

  5. #5
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 324
    Points
    4 324
    Par défaut
    Citation Envoyé par Deallyra Voir le message
    Le problème de la seconde est qu'il s'agit d'une requête corrélée...
    Ah oui en effet j'avais pas fait attention , le nombre de requête sera donc proportionnel au nombre de tuple présent dans table employees dans la requête 2.
    Jai tendance à éviter au maximum ce type de requête plutôt lourde pour la db.

    Peut-être qu'avec un extrait du MLD et ce que tu cherche à faire on aurait un avis plus critique, tu as ça sous la main ?

    pour calculer le temps d'exécution je pense que cette discussion t'aidera.
    http://alaindefrance.wordpress.com
    Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
    SDE at BitTitan

  6. #6
    Inactif   Avatar de Deallyra
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    1 997
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 1 997
    Points : 1 769
    Points
    1 769
    Par défaut
    Hum.

    Un extrait du MLD je veux bien mais pour ce qu'il servira...
    (en fait, je n'arrive pas à travailler avec les MLD... Si j'ai un MLD, je dois en faire un MCD pour le comprendre dans son ensemble :3 )

    Heu... J'ai déjà fait le MCD... Ce sera déjà ça... Et je vais tenter de générer automatiquement le MLD ^^
    Pas envie de perdre du temps avec le MLD :s

    ( je n'arrive pas à générer un MLD textuel...)

    -> MCD
    *Si la réponse vous convient, n'oubliez pas le tag
    *Exprimez vous dans un français correct; on prend le temps de vous lire, prenez le temps de bien écrire.
    *Et comment on interprète votre code? N'oubliez pas la balise!

    *Pour une mise en page simple avec des divs.
    *Pour faire des formulaires xHTML CSS.

  7. #7
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 324
    Points
    4 324
    Par défaut
    J'aurais arrangé le MCD différemment mais mon windesign refuse de se lancer .

    Concernant tes requêtes, pourquoi ne pas passer par des tables temporaires ?
    Ça t'éviterais deux exécutions de requêtes au lieu d'une, toujours ça de gagné
    http://alaindefrance.wordpress.com
    Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
    SDE at BitTitan

  8. #8
    Inactif   Avatar de Deallyra
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    1 997
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 1 997
    Points : 1 769
    Points
    1 769
    Par défaut
    Table temporaire -> Vue ?

    Sinon, le modèle relationnel que j'ai eu... Ben c'est pas moi l'auteur ^^'
    Donc pour ce qui est de le faire différemment... C'est sûr u_u
    *Si la réponse vous convient, n'oubliez pas le tag
    *Exprimez vous dans un français correct; on prend le temps de vous lire, prenez le temps de bien écrire.
    *Et comment on interprète votre code? N'oubliez pas la balise!

    *Pour une mise en page simple avec des divs.
    *Pour faire des formulaires xHTML CSS.

  9. #9
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 324
    Points
    4 324
    Par défaut
    non non, table temporaire
    http://alaindefrance.wordpress.com
    Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
    SDE at BitTitan

  10. #10
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Conecernant ta 1ere requête je pense que tu devrais choisir entre =/<> et IN/NOT IN.

    Sinon concernant ta requête corrélée, vu que tu testes l'existance je l'aurais écrite comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT NOME, EMBAUCHE
    FROM li.employes a
    WHERE EXISTS (SELECT 1
    	      FROM li.employes b
    	      WHERE b.NOE = &1
    	      AND b.salaire=a.salaire
                  AND b.INDEM <> a.INDEM
                  );
    Personnelement, j'aime bien les requêtes corrêlées qui peuvent apportées des gains significatifs en terme de perfs.
    Mais sinon tu peux toujours passer par une sous requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select a.nome,a.embauche
    from employe a
    JOIN (select salaire,indem from employes where noe=&1) b on (a.salaire=b.salaire and a.indem<>b.indem)

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 207
    Points : 237
    Points
    237
    Par défaut
    Bonjour,

    Effectivement, pour comparer deux requetes, rien de mieux que de les executer de voir... (SET TIMING ON). En revanche attention au fait que les données une fois en cache peuvent fausser le résultat.

    sinon SET AUTOTRACE ON, qui en plus de plan d'execution donne également des statistiques en termes d'accès mémoire et disque, cet qui permet de comparer plus facilement.
    J'ai fait un petit post sur le sujet:http://www.lao-dba.com/article-23772890.html

    Attention également à la "fausse idée" qu'une requete avec le plus petit cost sera la plus rapide...

  12. #12
    Inactif   Avatar de Deallyra
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    1 997
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 1 997
    Points : 1 769
    Points
    1 769
    Par défaut
    Conecernant ta 1ere requête je pense que tu devrais choisir entre =/<> et IN/NOT IN.
    Pas d'accord ^^

    = ou <> permet de comparer deux opérandes.

    IN ou NOT IN permet de comparer une opérande à une liste potentiellement pourvue d'un unique élément.

    Attention également à la "fausse idée" qu'une requete avec le plus petit cost sera la plus rapide...
    Hum. Merci pour cette précision, je n'y avais pas réfléchi même si je le savais xD
    *Si la réponse vous convient, n'oubliez pas le tag
    *Exprimez vous dans un français correct; on prend le temps de vous lire, prenez le temps de bien écrire.
    *Et comment on interprète votre code? N'oubliez pas la balise!

    *Pour une mise en page simple avec des divs.
    *Pour faire des formulaires xHTML CSS.

  13. #13
    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 Deallyra Voir le message
    Bonsoir,

    J'aurais voulu savoir s'il était possible de savoir le temps que mettait une requête à se faire sous Oracle.

    En fait, j'aimerai faire des tests me permettant de savoir si une requête est plus rapide qu'une autre.
    ...
    Cherchez runstats_pkg sur le site AskTom. Pour la source téléchargez ToolsIuse.

  14. #14
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 38
    Points : 47
    Points
    47
    Par défaut
    Citation Envoyé par lallio Voir le message
    Bonjour, [...]
    Attention également à la "fausse idée" qu'une requete avec le plus petit cost sera la plus rapide...
    Comment est ce le cost et le temps d'execution pourrait être dissocié ?
    A priori à temps d'accès constant en moyenne, un cost plus élevé induit plus d'accès donc prend plus de temps ? ou bien est ce que quelque chose m'a échappé.
    Via l'utilisation du cache

    D'avance merci

  15. #15
    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 derise Voir le message
    Comment est ce le cost et le temps d'execution pourrait être dissocié ?
    A priori à temps d'accès constant en moyenne, un cost plus élevé induit plus d'accès donc prend plus de temps ? ou bien est ce que quelque chose m'a échappé.
    Via l'utilisation du cache

    D'avance merci
    Le coût est une estimation! Quand votre banquier vous promet de rendement allant jusqu’au 10 % sur un placement risqué il n’est pas garanti que vous allez toucher ces 10%. Il se peut qu’au bout de la ligne vous allez perdre de l’argent. C’est pareil avec le calcul du coût, si l’optimiseur se trompe le temps d’exécution sera en réalité plus long.

  16. #16
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 38
    Points : 47
    Points
    47
    Par défaut
    De ma courte expérience j'ai appris que la manipulation des statistiques sur la base impactait les performances des requetes. Je n'ai pas vraiment compris comment mais bon j'ai compris qu'il valait mieux laisser un vrai DBA s'en occuper.

    Si je comprends bien l'optimiseur peut se tromper. L'examen du plan d'exécution (sur lequel mon n+1 jure par dessus tout) peut donc s'avérer trompeur, de fait est ce que deux requetes ayant le meme plan d'execution peuvent avoir un comportement différent si elles sont lancées dans des environnements différents ? (typiquement de la recette a la prod)

  17. #17
    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 derise Voir le message
    De ma courte expérience j'ai appris que la manipulation des statistiques sur la base impactait les performances des requetes.
    ...
    Vrai en ce qui concerne l'optimiseur basé sur le coût.

    Citation Envoyé par derise Voir le message
    Je n'ai pas vraiment compris comment mais bon j'ai compris qu'il valait mieux laisser un vrai DBA s'en occuper.
    ...
    Il n'est pas possible d'optimiser ses requêtes sans comprendre comment ça marche. Pire encore le DBA ne peut rien face aus mauvais algorithmes.

    Citation Envoyé par derise Voir le message
    Si je comprends bien l'optimiseur peut se tromper. L'examen du plan d'exécution (sur lequel mon n+1 jure par dessus tout) peut donc s'avérer trompeur, de fait est ce que deux requetes ayant le meme plan d'execution peuvent avoir un comportement différent si elles sont lancées dans des environnements différents ? (typiquement de la recette a la prod)
    L'optimiseur utilise les informations concernant les statistiques des segments (tables, indexes, etc.) et les statistiques système plus des algorithmes issues de la théorie des probabilités pour élaborer son meilleur plan d'exécution. Si les statistiques sont incorrectes ou si la distribution des valeurs ne cadre pas avec les prémisses des algorithmes son meilleur plan d'exécution peut être sous optimale. Cella ne signifie pas que le plan d'exécution sur lequel ton n+1 jure n'est pas vrai mais que ce n'est pas tout simplement optimal.
    Dans ces conditions il est clair qu'une même requête peut avoir deux plans d'exécutions différents si les environnements sont différents. Contrairement à l'optimiseur en mode règle pour lequel le plan d'exécution était stable, de par sa nature l'optimiseur basée sur le coût ne peut pas garantir la stabilité de son plan, sauf les cases ou les statistiques sont imposées par l'utilisateur et non pas calculées.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Dissociation Euresys eVision/OpenCV en termes de rapidité
    Par rastakouair dans le forum OpenCV
    Réponses: 4
    Dernier message: 28/05/2010, 17h01
  2. Optimisation en terme de temps d'exécution
    Par SebastienLeto dans le forum Débuter
    Réponses: 22
    Dernier message: 10/06/2009, 16h50
  3. Optimiser rapidité code
    Par bobosh dans le forum VBA Access
    Réponses: 2
    Dernier message: 28/08/2008, 16h12
  4. Optimisation code pour gagner en rapidité
    Par polodu84 dans le forum MATLAB
    Réponses: 2
    Dernier message: 05/03/2008, 15h32
  5. Optimisation de mémoire / rapiditée
    Par Zenol dans le forum C++
    Réponses: 9
    Dernier message: 25/09/2005, 11h18

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