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 :

[SQL2] [AVIS] Pgm Client VS Procedure Stockee


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur
    Avatar de benwit
    Profil pro
    dev
    Inscrit en
    Septembre 2004
    Messages
    1 676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Septembre 2004
    Messages : 1 676
    Par défaut [SQL2] [AVIS] Pgm Client VS Procedure Stockee
    Bonjour,

    J'ai une table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CREATE TABLE tb
    (
        tb_id  INTEGER,
        tb_val INTEGER,
        tb_key INTEGER,
     
        CONSTRAINT tb_pk PRIMARY KEY (tb_id)
    );
    J'ai un jeu de test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    INSERT INTO tb VALUES (1,  1, 1);
    INSERT INTO tb VALUES (2,  5, 4);
    INSERT INTO tb VALUES (3,  2, 1);
    INSERT INTO tb VALUES (4,  1, 2);
    INSERT INTO tb VALUES (5,  2, 3);
    INSERT INTO tb VALUES (6,  4, 2);
    INSERT INTO tb VALUES (7,  3, 3);
    INSERT INTO tb VALUES (8,  3, 4);
    INSERT INTO tb VALUES (9,  4, 5);
    INSERT INTO tb VALUES (10, 5, 6);
    INSERT INTO tb VALUES (11, 1, 5);
    INSERT INTO tb VALUES (12, 5, 1);
    Je veux obtenir toutes les valeurs tb_val pour lesquelles tb_key vaut (1 ou 4 ou 3) et (2 ou 4) et (5 ou 3)
    Soit dans l'exemple :
    car la val 2 échoue pour (2 ou 4), la val 4 échoue pour (1 ou 4 ou 3) et la val 5 échoue pour (5 ou 3)

    Quelle est la meilleure requête pour obtenir 1 et 3 en résultats pour le jeu de test fourni ?

    Merci à tous ce qui releveront ce défi !

  2. #2
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Par défaut
    Testé avec ton jeu d'essai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT DISTINCT tb_val
    FROM tb a
    WHERE tb_key IN(1, 4, 3)
      AND EXISTS (SELECT NULL
                  FROM tb b
                  WHERE a.tb_val = b.tb_val
                  AND b.tb_key IN(2, 4))
      AND EXISTS (SELECT NULL
                  FROM tb b
                  WHERE a.tb_val = b.tb_val
                  AND b.tb_key IN(3, 5))
    Résultat : 1 et 3

    PS : A tous les autres posteurs : en postant les create table et les insert benwit m'a permis de ne mettre que 10 secondes pour avoir de quoi faire des tests et donner une réponse garantie, à bon entendeur ...

  3. #3
    Membre Expert 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
    Par défaut
    Voila ma reponse

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT 
         distinct a.tb_val 
    FROM 
          tb a , tb b, tb c
    WHERE
          a.tb_val = b.tb_val and b.tb_val=c.tb_val
          and a.TB_KEY in (1,4,3) and b.TB_KEY in (2,4) and c.TB_KEY in (3,5);

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 81
    Par défaut
    ReBonjour.
    je te remercie pour la clarté de ton msg. en plus avec le script et le jeux d'essai j'ai pu créer la table tb remplie. j'ai testé la requête qu'à proposé Médiat et ça marche bravo. mais

    j'ai constaté que ta condition
    pour lesquelles tb_key vaut (1 ou 4 ou 3) et (2 ou 4) et (5 ou 3)
    est tout le temps fausse, démonstration:
    soit a = (1 ou 4 ou 3)
    b = (2 ou 4)
    c = (5 ou 3)
    pour satisfaire a et b en même temps il faut que tb_key=4 or la clause c n'est pas satisfaite!

    alors que penses-tu?

  5. #5
    Membre Expert 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
    Par défaut
    Citation Envoyé par jarod_ab
    ReBonjour.
    je te remercie pour la clarté de ton msg. en plus avec le script et le jeux d'essai j'ai pu créer la table tb remplie. j'ai testé la requête qu'à proposé Médiat et ça marche bravo. mais

    j'ai constaté que ta condition
    pour lesquelles tb_key vaut (1 ou 4 ou 3) et (2 ou 4) et (5 ou 3)
    est tout le temps fausse, démonstration:
    soit a = (1 ou 4 ou 3)
    b = (2 ou 4)
    c = (5 ou 3)
    pour satisfaire a et b en même temps il faut que tb_key=4 or la clause c n'est pas satisfaite!

    alors que penses-tu?
    Si j'ai bien compris, ce n'est pas un ET logique sur tb_key qu'il veut, mais mais l'ensemble des valeurs qui ont au moins 3 tb_keys et dont les tb_keys sont (1 ou 3 ou 4) et (2 ou 4) et (5 ou 3)

    Donc par exemple :
    la valeur 1 est presente en Id=1 avec tb_key=1 donc rempli la condition (1 ou 3 ou 4)
    Cette meme valeur est presente en id = 4 avec tb_key=2 donc rempli la condition (2 ou 4)
    Et enfin on la retrouve en Id=11 avec tb_key=5 donc rempli la condition (3 ou 5)
    L'ensemble des tb_key de la valeur 1 repond donc aux criteres exigés.

    Voila ce que j'ai compris.
    Maintenant j'ai pu me tromper

  6. #6
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Par défaut
    Citation Envoyé par Yanika_bzh
    l'ensemble des valeurs qui ont au moins 3 tb_keys
    ou 2 valeurs : 4 et 5 par exemple.
    [Edit] J'avais écrit une bêtise[/Edit]

  7. #7
    Rédacteur
    Avatar de benwit
    Profil pro
    dev
    Inscrit en
    Septembre 2004
    Messages
    1 676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Septembre 2004
    Messages : 1 676
    Par défaut

    Merci à vous pour votre rapidité de réponse (comme quoi lire les bons usages du post, ça paye ! ), les deux requêtes marchent impec !

    Citation Envoyé par Yanika_bzh
    Si j'ai bien compris, ce n'est pas un ET logique sur tb_key qu'il veut, mais mais l'ensemble des valeurs qui ont au moins 3 tb_keys et dont les tb_keys sont (1 ou 3 ou 4) et (2 ou 4) et (5 ou 3)

    Voila ce que j'ai compris.
    Yanika_bzh, tu as parfaitement compris ce que je voulai.

    jarod_ab, comment aurai-tu exprimer la chose toi qui semble matheux

    Il est vrai que mon problème est un peu plus compliqué puisque n, le nombre de bloc de () et prime, le nombre d'éléments dans chaque bloc de () peut varier. C'est (1', 1'', ...) et ... (i', i'', ...) ... et (n',n'', ...)
    La valeur d'un i' n'étant pas forcément égale à la valeur d'un n'' mais cela pouvant arriver, c'est donc volontairement que j'ai inclu ce cas de figure dans mon petit jeu de test.

    Pour peu que les temps de réponse de mySQL sur un si petit jeu de données soient significatifs, celle de Yanika_bzh (avec les jointures) semblent un poil plus rapide que celle de Médiat (avec les sous requêtes).

    Sachant que je vais construire la requête (fonction de n et de prime pour chaque valeur de n), que me conseillez vous ? la requête avec les jointures ou celle avec les sous requêtes ?
    Et à votre avis, est-ce une bonne idée de construire ce genre de requête avec du code Java ou mieux vaudrait faire une procédure stockée ? et si oui, pourquoi et comment ?

    Merci.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 81
    Par défaut
    Bonjour tout le monde. désolé, je n'ai pas bien compris au début. bravo à Médiat et Yanika_bzh qui ont relevés le défi !
    cordialement.

  9. #9
    Membre Expert 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
    Par défaut
    Citation Envoyé par jarod_ab
    Bonjour tout le monde. désolé, je n'ai pas bien compris au début. bravo à Médiat et Yanika_bzh qui ont relevés le défi !
    cordialement.
    Pas un défi, si on peut aider, c'est tout
    Des fois on fais des trucs bien et des fois pas top (enfin surtout moi)!!

    Merci jarod_ab

  10. #10
    Membre Expert 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
    Par défaut
    Citation Envoyé par benwit

    Merci à vous pour votre rapidité de réponse (comme quoi lire les bons usages du post, ça paye ! ), les deux requêtes marchent impec !

    Citation Envoyé par Yanika_bzh
    Si j'ai bien compris, ce n'est pas un ET logique sur tb_key qu'il veut, mais mais l'ensemble des valeurs qui ont au moins 3 tb_keys et dont les tb_keys sont (1 ou 3 ou 4) et (2 ou 4) et (5 ou 3)

    Voila ce que j'ai compris.
    Yanika_bzh, tu as parfaitement compris ce que je voulai.

    jarod_ab, comment aurai-tu exprimer la chose toi qui semble matheux

    Il est vrai que mon problème est un peu plus compliqué puisque n, le nombre de bloc de () et prime, le nombre d'éléments dans chaque bloc de () peut varier. C'est (1', 1'', ...) et ... (i', i'', ...) ... et (n',n'', ...)
    La valeur d'un i' n'étant pas forcément égale à la valeur d'un n'' mais cela pouvant arriver, c'est donc volontairement que j'ai inclu ce cas de figure dans mon petit jeu de test.

    Pour peu que les temps de réponse de mySQL sur un si petit jeu de données soient significatifs, celle de Yanika_bzh (avec les jointures) semblent un poil plus rapide que celle de Médiat (avec les sous requêtes).

    Sachant que je vais construire la requête (fonction de n et de prime pour chaque valeur de n), que me conseillez vous ? la requête avec les jointures ou celle avec les sous requêtes ?
    Et à votre avis, est-ce une bonne idée de construire ce genre de requête avec du code Java ou mieux vaudrait faire une procédure stockée ? et si oui, pourquoi et comment ?

    Merci.
    si "n" est indeterminé, les requetes proposées vont etre difficiles a appliquer

    peut etre qu'en utilisant les bits tu pourrais t'en sortir : au lieu d'avoir des tb_key a 1,2,3,4,... tu aurais 1,2,4,8,16,32, ....
    Apres, tu sommes toutes tes colones et tu appliques ton filtre en bit a bit.
    C'est une idée que je te donne brute de pomme.

    Bon courage.

  11. #11
    Rédacteur
    Avatar de benwit
    Profil pro
    dev
    Inscrit en
    Septembre 2004
    Messages
    1 676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Septembre 2004
    Messages : 1 676
    Par défaut
    n est variable mais sera connu (comme le nombre de prime pour chaque n) au niveau programme donc je pense que je vais suivre mon idée de départ : construire la requête en Java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT
         distinct a.tb_val
    FROM
          tb a, ... tb i, ... tb n
    WHERE
          a.tb_val = i.tb_val AND ... AND i.tb_val = n.tb_val
          AND a.tb_key IN (...) AND ... AND n.tb_key IN (...);
    Je vais prendre la tienne car si n ne dépassera pas quelques dizaines, je pense qu'elle sera néanmoins plus rapide lorsque n vaudra 10 par exemple que l'autre où il faudrait faire 10 sous requêtes.

    J'ai lu que les requêtes préparées sont plus rapides dans la mesure où le SGBD prépare un chemin d'execution.
    Je me demandai juste si ce programme de construction de la requête fait au niveau de procédure stockée ne serait pas plus performant pour les mêmes raisons.
    N'en ayant jamais fait, je me demande ce que les experts bases de données en pensent ?

    NB : J'ai modifié le titre du sujet pour refléter cette nouvelle problématique.

Discussions similaires

  1. Probleme Oracle + Procedure Stockee
    Par ForumWWW dans le forum Bases de données
    Réponses: 5
    Dernier message: 09/07/2004, 16h00
  2. [debutant] Postgres et les procedures stockees
    Par bmayer dans le forum PostgreSQL
    Réponses: 11
    Dernier message: 09/01/2004, 10h18
  3. Réponses: 5
    Dernier message: 11/12/2003, 14h45
  4. procedure stockee et sql
    Par fred33 dans le forum SQL
    Réponses: 2
    Dernier message: 27/11/2003, 10h23
  5. [VB6] [ADO] Procedure stockée : spécifier les paramètres
    Par adepdoom dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 16/10/2002, 10h45

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