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 :

Grosse Requete ou Requete sur une vue ?


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    145
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 145
    Points : 77
    Points
    77
    Par défaut Grosse Requete ou Requete sur une vue ?
    Bonjour à tous,

    je me pose une question pour savoir ce qui serai le plus rapide et le plus propre à executer voila mon problème :

    j'ai une table qui possede plusieurs clés étrangères.

    je souhaite faire une requete pour recuperer toutes les info liées à cette table donc je part avec une requete et des INNER JOIN.

    ma question est-il préférable de
    créer une vue avc toutes ces inner join et apres de requeter dans cette vue
    ou de faire une grosse requete a chaque fois ?

    Merci pour vos conseils

  2. #2
    Membre éprouvé Avatar de Mathusalem
    Profil pro
    IT moa
    Inscrit en
    Décembre 2003
    Messages
    1 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : IT moa

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 008
    Points : 1 067
    Points
    1 067
    Par défaut
    une vue, c'est juste un select, donc tu demandes si il est plus rapide de faire un select comparé à un select * from (select ...).


    Je vote contre la vue

  3. #3
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 249
    Points : 1 745
    Points
    1 745
    Par défaut vue ou requete.
    Bonjour à tous,

    je me pose une question pour savoir ce qui serai le plus rapide et le plus propre à executer voila mon problème :

    j'ai une table qui possede plusieurs clés étrangères.

    je souhaite faire une requete pour recuperer toutes les info liées à cette table donc je part avec une requete et des INNER JOIN.

    ma question est-il préférable de
    créer une vue avc toutes ces inner join et apres de requeter dans cette vue
    ou de faire une grosse requete a chaque fois ?

    Merci pour vos conseils
    L'avantage d'une vue, c'est de pouvoir renommer les colonnes de résultats et de donner du sens au code SQL lorsque l'on relit les requêtes .net.

    Personnellement, je préférerais utiliser une procédure stockée plutôt qu'une vue:
    - Une procédure stockée a l'avantage de déporter la complexité dans le SGBD et de centraliser tout ce qui est SQL au même endroit.
    - Une procédure stockée est aussi performante qu'une requête.
    - On réduit le traffic réseau en déportant le code coté serveur.

  4. #4
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    145
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 145
    Points : 77
    Points
    77
    Par défaut
    je ne vois pas l'interet d'une procedure stockée pour obtenir mon résultat car une procedure stockée c'est une sorte de fonction où l'on peut passer des paramètres à moins que je ne vois pas les possibilités que nous offre les procédures ? ...

    aussi autre petit problème je suis sur MySQL et je ne suis pas sur qu'il integre les procedures stockées... ca reste a verifier

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    777
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 777
    Points : 1 077
    Points
    1 077
    Par défaut
    Et tout cas ce qui est sure c'est que faire une vue ou l'integrer directement dans ta requette ca ne changera rien. Appart être plus lisible p-t

  6. #6
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 249
    Points : 1 745
    Points
    1 745
    Par défaut pour faire avancer le debat.
    je ne connais pas MYSQL mais sous sql serveur il est tout a fait possible d'écrire la requete suivante ( sans parametre ):
    create procedure test as select * from matable;

  7. #7
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    145
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 145
    Points : 77
    Points
    77
    Par défaut match nul
    comme le dit Mathusalem la vue sera moins rapide mais comme le dit aussi Dokho1000 comme je dois faire plusieurs fois cette requete au niveau lisibilité la vue marque un point

    Requete : 1 (execution)
    Vue : 1 (lisibilité)

    sachant que ma vue est une requete composée de 5 UNION...

    comme je sais pas trop comment faire on va prendre le problème plus haut encore.

    j'ai une table qui fait reference a 5 autre tables sachant que sur une ligne il n'y a qu'une seule reference noté et les 4 autres à null.

    comment faire pour avoir tous les liens sans forcement avoir un requete a chaque fois de 20 lignes?

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    777
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 777
    Points : 1 077
    Points
    1 077
    Par défaut
    Moi j'ai pas torp compris ta nouvelle question, ta pas un petit schema... c'est nettement plus facil pour trouver et comprendre une requette

  9. #9
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    145
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 145
    Points : 77
    Points
    77
    Par défaut
    Voila le diagramme,

    sachant quand dans la table 1 les champs id2, id3 et id4 ne sont jamais rempli en meme temps c'est soit id2, soit id3, soit id4.

    la requete c'est obtenir tout, c'est a dire table 1 avec les liens et les info dans les table 2,3 et 4

    si je dois utiliser cette requete a plusieurs endroit peut-etre qu'un vue serai preferable, non?
    Images attachées Images attachées  

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    777
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 777
    Points : 1 077
    Points
    1 077
    Par défaut
    et bien tu peux faire un union sur les 3 autres tables, ensuite tu fais un select de ta premiere table avec un inner join sur la table avec les 4 union...

    J'ai pas testé et pas bcp réfléchis mais ca devrait marcher...

    ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select * from table1 t1 inner join (select avec les 4 union) u1 on ui.tableid = t1.id2 or tableid = t1.id3 or tableid = t1.id4
    evidement pour ca il faut que entre les 3 autre tables les id soient unique a travers les 3 tables

    si chaque table à un id qui vaut 1 par exemple ca ne marchera pas.

  11. #11
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    145
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 145
    Points : 77
    Points
    77
    Par défaut
    ba je vois pas trop l'interet de faire une union pour ca.

    une requete avec des jointures externes suffit je pense.

    Maintenant comme cette requete sera appelée à plusieurs endroits, je pense faire une vue pour ne pas avoir 20 lignes de requetes a chaque fois dans mes pages de code

    qu'en pensez-vous?

  12. #12
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    777
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 777
    Points : 1 077
    Points
    1 077
    Par défaut
    disont que je ne vois pas trop ce que tu veux faire, on ne sait deja pas quelle sont les relation entre tes tables donc vala.

  13. #13
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    145
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 145
    Points : 77
    Points
    77
    Par défaut
    Bon alors je vais essayer d'etre plus clair admettons que j'ai 3 tables

    une table activite:
    id_activite
    id_incident
    id_projet
    jour
    ...

    une table incident :
    id_incident
    titre
    client
    ...

    une table projet
    id_projet
    titre
    client
    date de fin
    ...

    je souhaite faire une vue qui me fasse la requete suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT * FROM activite
    LEFT JOIN incident ON incident.id_incident = activite.id_incident
    LEFT JOIN projet ON projet.id_projet  = activite.id_projet
    la question est :
    dois je faire une vue et interrogé cette vue sachant que cette vue pourra etre utilisé partout et donc que les requetes seront plus lisibles
    ou dois-je faire une requete comme ci dessus à chaque fois que j'ai besoin de mes infos sachant qu'ici il n'y a que 3 tables et j'ai fait un SELECT * donc dans la pratique la requete sera plus longue au niveau syntaxe.


    j'espere vous avoir expliquer plus clairement ce que je souhaite faire.

    Merci pour vos reponses

  14. #14
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    777
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 777
    Points : 1 077
    Points
    1 077
    Par défaut
    Et bien si tu l'utilise plusieur fois cette requette moi je ferais une vue car ca te simplifie la vie, d'autant plus si tu dois faire un update sur ces 3 table en meme temps vu que tu pourra utiliiser la vue pour le faire. (Seulement sur Microsoft SQL, sur oracle ca ne fonctionne pas)

    Donc voila mon avis

  15. #15
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 102
    Points : 28 403
    Points
    28 403
    Par défaut
    Lorsqu'on utilise une vue dans une requête, il faut toujours se poser la question de savoir si elle ne fait pas plus de choses que nécessaire pour l'utilisation qu'on en fera.
    Par exemple (trouvé dans des applications) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    CREATE VIEW vue_union
    AS  (   SELECT  tb1.id
            FROM    matable AS tb1
            WHERE   tb1.valeur < 5
        UNION
            SELECT  tb2.id
            FROM    autretbl AS tb2
            WHERE   tb2.valeur > 8  
        )
    ;
     
    SELECT  vue.id
    FROM    vue_union   AS vue 
    WHERE   vue.id > 10
    ;
     
    CREATE VIEW vue_groupe
    AS  (   SELECT  tb1.id
                ,   tb2.lib
                ,   SUM(tb1.valeur) AS somme
                ,   MIN(tb1.valeur) AS mini
                ,   MAX(tb1.valeur) AS maxi
                ,   COUNT(*)        AS nombre
            FROM    matable AS tb1
                INNER JOIN
                    meslibs AS tb2
                    ON  tb1.idlib = tb2.idlib
            GROUP BY    tb1.id, tb2.lib
        )
    ;
     
    SELECT  vue.id
        ,   vue.libelle
    FROM    vue_groupe  AS vue 
    ;
    Etait-il utile de passer par la vue dans ces cas là ?
    Même si fonctionnellement, cela semblait plus simple parce que "le contenu de la vue pourrait évoluer sans qu'on ait a réécrire toutes les requêtes qui l'appellent" ?

  16. #16
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    145
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 145
    Points : 77
    Points
    77
    Par défaut
    oui je comprends la problematique que tu soulèves al1_24.

    faire une vue pour 2 voir 3 tables ca n'a pas d'interet.

    donc je ne sais pas si la mienne est vraiment plus utile, elle comporte une 20 champs et 5 jointures (internes et externes).

    mais comme dans mon code je dois récuperer ces 20 champs a plusieurs endroits, je pensais qu'une vue simplifierai la chose un peu dans la logique de Dokho1000 sauf que je suis sous MySQL...

Discussions similaires

  1. faire des requetes sur une vue
    Par lorie dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 19/05/2011, 11h28
  2. Requete SQL sur une vue
    Par MASSAKA dans le forum Langage SQL
    Réponses: 13
    Dernier message: 07/01/2010, 16h17
  3. Probleme de requete sur une vue
    Par MaInR0 dans le forum JDBC
    Réponses: 10
    Dernier message: 10/11/2008, 20h26
  4. [VBA-E] Requetes depuis Excel sur une Base Access sécurisée
    Par DhiSan dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 31/05/2006, 18h44
  5. requetes BUSINESS OBJECT sur une base ACCESS
    Par greatmaster1971 dans le forum Deski
    Réponses: 1
    Dernier message: 06/10/2004, 14h10

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