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

Requêtes PostgreSQL Discussion :

Sessions SQL + tables temporaires + COUNT


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Apprenti Ingénieur R&D
    Inscrit en
    Octobre 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Apprenti Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2013
    Messages : 20
    Points : 13
    Points
    13
    Par défaut Sessions SQL + tables temporaires + COUNT
    Bonjour à tous,

    Je rencontre quelques petits soucis dans mon développement, et je sollicite donc votre aide

    Afin d'optimiser les performances, je suis amené à utiliser une table temporaires pour stocker le résultats d'une requête pouvant être complexe, sur une table comportant un très grand nombre d’occurrences.
    Cependant, j'ai également besoin de savoir le nombre d’occurrences qui sont ajoutées dans ma table temporaire.

    Je travaille avec JDBC sous Java, et PostgreSQL.

    Ma création de table se fait donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CREATE TEMPORARY TABLE temp_table
    AS
    SELECT * ....
    Jusque-là, pas de soucis. En revanche, je bloque sur une solution me permettant de récupérer le nombre d’occurrences ajoutées.
    En deux requêtes, je ferais simplement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     SELECT COUNT(*) FROM temp_table
    Cependant, là encore pour des soucis de performances, je suis contraint de tout traiter en une seule requête.
    Ma requête doit donc: créer ma table temporaire en fonction d'une requête plus complexe ET me renvoyer le nombre d’occurrences ajoutées dans ma temp_table.

    J'ai donc envisagé de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CREATE TEMPORARY TABLE temp_table
    AS
    SELECT *, COUNT(*) FROM ... WHERE ... GROUP BY ...
    Mais le souci, c'est que je vais sûrement devoir appliquer mon GROUP BY sur l'ID de ma table. Et le souci est donc qu'au lieu de retourner le nombre total de lignes de ma table, eh bien je récupère '1' (logique !).

    Avez vous une astuce à me proposer ?


    La partie en bleu est résolue

    J'ai une deuxième question, portant cette fois sur la notion de 'session sql'.
    Dans la documentation de PostgreSQL, on peut lire qu'une table temporaire existera uniquement le temps d'une session SQL.
    Comment se délimite une session ? C'est la période entre la connexion au serveur et la déconnexion ?

    Et niveau multi-utilisateurs, que se passerait-il si:
    - Un utilisateur U1 exécute une première requête créant ma table temp_table.
    - Un autre utilisateur U2 exécute une requête différentes créant elle aussi la même table temp_table.

    - Si mon utilisateur U1 interroge alors temp_table, que récupérerait-il ? les données de la requête qu'il a exécutée ? Ou les données de la requête de U2 ?

    J'ai besoin de voir temp_table comme une table unique pour chaque utilisateur. U1 ne pourra récupérer que les résultats de SA requête, U2 idem etc.

    Merci d'avance de votre aide

  2. #2
    Membre expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 590
    Points
    3 590
    Billets dans le blog
    8
    Par défaut
    Salut
    Il faut plutôt utiliser une vue matérialisée pour résoudre ton problème.
    Les sessions sont comme des boites créées par connexion, une boite dans laquelle on enferme l'utilisateur. Certaines des infos sont propres à chaque boite (variable temporaire, dernier incrément...) d'autres sont communes.
    Pour une variable (ou table) temporaire il y a deux niveaux de portés : globale->toute la session (boite) et locale->uniquement la fonction/procédure qui crée la variable.
    @+
    Le monde est trop bien programmé pour être l’œuvre du hasard…
    Mon produit pour la gestion d'école: www.logicoles.com

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Pour le nombre d'entrées créées dans la table temporaire, le serveur le renvoie directement sans qu'il n'y ait de requête supplémentaire à faire.

    En langage C, c'est via la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PQcmdTuples(PGresult *res);
    L'interpréteur psql l'affiche également de base en retour de l'exécution d'un CREATE TABLE ...AS SELECT...
    Avec JDBC il y a sans doute moyen de récupérer cette valeur, il faut chercher dans la doc.

    Pour la session c'est bien entre la connexion et la déconnexion, et une table temporaire créée dans une session est inexistante pour une autre session, qu'elles aient le même nom ou pas. Il n'y a pas de conflit possible.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Apprenti Ingénieur R&D
    Inscrit en
    Octobre 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Apprenti Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2013
    Messages : 20
    Points : 13
    Points
    13
    Par défaut
    Merci de vos réponses

    Effectivement, pour le nombre d'occurrences créées, le souci vient de la surcouche JDBC que j'utilise. Le problème est donc réglé

    Je vais me pencher sur les vues matérialisées, effectivement ça semble correspondre davantage à ce dont j'ai besoin !

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

Discussions similaires

  1. 4D SQL Table Temporaire
    Par bella1 dans le forum 4D
    Réponses: 2
    Dernier message: 23/07/2014, 09h52
  2. [SQL] - Table temporaire unique
    Par Sieldev dans le forum Développement
    Réponses: 4
    Dernier message: 27/01/2009, 16h34
  3. Réponses: 12
    Dernier message: 30/01/2007, 13h37
  4. [sql-8]table temporaire # : Pourquoi?
    Par Baquardie dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 31/10/2006, 00h50
  5. MS SQL SERVER et les tables temporaires
    Par beb_has_return dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 11/02/2005, 14h36

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