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

Langage SQL Discussion :

A propos des sous-requêtes


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 23
    Points : 20
    Points
    20
    Par défaut A propos des sous-requêtes
    Bonjour à tous,

    J'effectue un petit stage d'été en développement web mais je suis un peu débutant (je passe en 2ème année de DUT Info) donc j'aurais quelques questions à propos des sous-requêtes :

    - Est-ce que le SGBD réévalue à chaque fois une même sous-requête qu'on réutilise plusieurs fois dans une clause SELECT ou se sert-il d'une sorte de signature pour savoir si cette requête a déjà été exécuté ?

    ex : SELECT IF((SELECT COUNT(*) FROM table1) = 0, 'Vide', (SELECT COUNT(*) FROM table1))

    (Exemple purement théorique ^^)

    - Si oui est-il possible de stocker temporairement le résultat d'une sous-requête pour la réutiliser tout au long de la requête principale ?

    - Est-ce que cela dépend du SGBD ? (je travaille avec MySQL)

    Merci d'avance pour vos réponses

  2. #2
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Vous aurez la reponse en interrogeant le plan d'execution de votre requete.

    Bon courage
    Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 23
    Points : 20
    Points
    20
    Par défaut
    Merci pour votre réponse (on peut pas se tutoyer ? ) mais comment fait-on ? Est-ce en utilisant le mot clé EXPLAIN ?

  4. #4
    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 !

    Oui tout à fait, c'est EXPLAIN.

    Sinon pour répondre un peu à tes autres questions (tu peux me tutoyer, pas de problème ) :
    - la manière de calculer, optimiser, stocker physiquement les données est propre aux SGBD.

    Oracle par exemple peut profiter de la redondance d'une sous-requête pour ne calculer le résultat qu'une fois... mais il faut la factoriser avec la clause WITH !

    - A mon avis, le seul moyen de stocker le résultat temporairement et le réutiliser sous MySQL... c'est de la faire toi-même ! Tu crées ta table temporaire tu y mets le résultat de la requête (ainsi que toutes les colonnes dont t'auras besoin pour rassembler les morceaux).

    (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/

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 23
    Points : 20
    Points
    20
    Par défaut
    D'accord donc j'ai essayé avec EXPLAIN avec le même exemple que dans mon premier post, voici le résultat (j'ai tapé la requête dans la console de phpmyadmin) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    id 	select_type 	table 	type 	possible_keys 	key 	key_len 	ref 	rows 	Extra
    1 	PRIMARY 	NULL 	NULL 	NULL 	NULL 	NULL 	NULL 	NULL 	No tables used
    3 	SUBQUERY 	NULL 	NULL 	NULL 	NULL 	NULL 	NULL 	NULL 	Select tables optimized away
    2 	SUBQUERY 	NULL 	NULL 	NULL 	NULL 	NULL 	NULL 	NULL 	Select tables optimized away
    La sous-requête s'effectue donc deux fois ?

    Dommage pour moi

  6. #6
    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 pouvez essayer de le mettre dans le from, en reprenant votre exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT IF( SR.Nb = 0, 'Vide', SR.Nb)
    FROM (SELECT COUNT(*) AS Nb FROM table1) SR

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 23
    Points : 20
    Points
    20
    Par défaut
    Effectivement Waldar je penses que ta méthode est une bonne idée. Je vais voir si je peux l'appliquer sur certaines de mes requêtes.

    Sinon c'est dommage que SQL ne puisse pas reconnaître les sous-requêtes déjà exécutés, ça serait une bonne optimisation.

    Je passe le sujet en résolu merci à tous ^^

  8. #8
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Cela ne depend pas de SQL mais du moteur d'analyse de votre SGBD.

    Je viens de tester sur ASE 12.5, il le gere tres bien

    Bon courage
    Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 23
    Points : 20
    Points
    20
    Par défaut
    Ah... je supposes que c'est possible de changer le moteur d'analyse de MySQL ?

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

Discussions similaires

  1. [AC-2003] Création d'index dans des sous-requêtes
    Par buzz73 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 06/08/2009, 14h33
  2. Afficher des sous-requêtes dans une requête
    Par ZashOne dans le forum Sql*Plus
    Réponses: 6
    Dernier message: 16/04/2008, 10h07
  3. Problème avec des sous requêtes
    Par nicocolt dans le forum Requêtes
    Réponses: 2
    Dernier message: 10/10/2007, 15h19
  4. exprimer des sous requêtes
    Par Smix007 dans le forum SQL
    Réponses: 2
    Dernier message: 12/07/2007, 18h07
  5. Réponses: 28
    Dernier message: 17/07/2006, 16h30

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