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 MySQL Discussion :

CREATE TABLE SELECT


Sujet :

Requêtes MySQL

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 192
    Points : 395
    Points
    395
    Par défaut CREATE TABLE SELECT
    Bonjour,
    MySQL 5.1.48
    J'ai une base qui contient une table T et une procédure P.
    Cette procédure a comme paramètre IN un INTEGER et en INOUT un code retour.

    En gros cette procédure fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE TABLE T2 SELECT * FROM P;
    puis supprimme la table T2 et tout ceci le nombre de fois passé en paramètre.

    Rien de bien utile mais surtout rien de bien compliqué.

    Je me demande pourquoi lorsque je me connecte au serveur depuis un host distant et que j'exécute (call) cette procédure, j'ai un trafic réseau qui gonfle comme si le serveur me (me = client) renvoyais le résultat du SELECT *.

    Dans la même logique, SQL Server me renvoie des données mais pas si la requête est faite pour créer une autre table à partir du résultat du SELECT (ce qui est ce à quoi je m'attendais aussi pour MySQL).

    merci pour vos réponses d'experts... j'espère

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 766
    Points : 52 561
    Points
    52 561
    Billets dans le blog
    5
    Par défaut
    MySQL est en pratique très loin d'être optimisé ! Ce n'est qu'une vulgaire encapsulation de SQL sur des fichiers cobol avec un ersatz de transactions...
    Ne vous étonnez donc pas des performances lamentables dans certaines circonstances...
    A lire : http://blog.developpez.com/sqlpro/p9...udre-aux-yeux/
    Pour les perf, lire :
    http://blog.developpez.com/sqlpro/p9...udre-aux-yeux/

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 192
    Points : 395
    Points
    395
    Par défaut
    merci pour l'info.
    Dommage que ça ne réponde pas à ma question toutefois

    J'ai un début de réponse ou en tout cas de nouveaux éléments.

    L'action que je décris (l'appel à la proc) est fait depuis un programme JAVA (mysql-connector-java-5.1.14-bin.jar).

    Si je fais le même call avec le même user, depuis la même machine mais en interactif (en tapant mon appel directement dans le client MySQL) alors là il semble que j'ai le comportement attendu... pas de traffic réseau entrant sur le client depuis le serveur...

    C'est peut-être lié à la manière dont le JAVA execute la query qui fait le call ... ?

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 766
    Points : 52 561
    Points
    52 561
    Billets dans le blog
    5
    Par défaut
    Poste le code de ta proc.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 192
    Points : 395
    Points
    395
    Par défaut
    la proc:
    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
    delimiter //
     
    CREATE PROCEDURE test(IN nLoops INTEGER, INOUT Res INTEGER)
    BEGIN
      DECLARE i INT DEFAULT 0;
      IF nLoops > 0 THEN
        WHILE(i < nLoops) DO 
          CREATE TABLE TEST2 AS SELECT * FROM TEST1;
          DROP TABLE TEST2;
          SET i = i + 1;
        END WHILE;
      END IF;
      IF i = nLoops THEN
        IF Res <> 0 THEN
          SET Res = 1;
        END IF;
      END IF;
    END//
     
    delimiter ;

    appelé par le JAVA comme ça:

    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
    PreparedStatement PrepStmt = null;
    ResultSet rs = null;
    int nbLoop = 250;
    
    try {
      PrepStmt = con.prepareStatement("SET @inOutResult=-1");
      PrepStmt.executeUpdate();
    
      PrepStmt = con.prepareStatement("CALL test(" + nbLoop + ", @inOutCPUResult)");
      PrepStmt.executeUpdate();
    
      PrepStmt = con.prepareStatement("SELECT @inOutResult");
      rs = PrepStmt.executeQuery();
      if (rs.next()) {
    
    //etc. etc.
    => trafic réseau entrant (et je ne souhaite pas le résultat du select)


    et appelé depuis le client MySQL comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    mysql> set @loop = 250;
    mysql> set @ret = -1;
    mysql> call test(@loop, @ret);
    => pas de trafic réseau entrant (et je ne souhaite toujours pas le résultat du select, ça tombe bien)

    donc je me demandais si ça ne venait pas du 2ème "executeUpdate();"

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 192
    Points : 395
    Points
    395
    Par défaut bon en fait ça fonctionne
    si je fais un truc comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ...
    String strSetLoopNb = new String("SET @nbLoops=");
    strSetLoopNb = strSetLoopNb.concat(String.valueOf(nbLoop));
    PrepStmt = con.prepareStatement(strSetLoopNb);
    PrepStmt.executeUpdate();
     
    PrepStmt = con.prepareStatement("CALL test(@nbLoops, @inOutCPUResult)");
    PrepStmt.executeQuery();
    ...
    Dans mon cas, je rappelle que ce qui me posait problème était d'avoir du traffic réseau qui était retourné au client.
    Rempacer dans le call l'appel avec la variable JAVA par son équivalent avec une variable de session MySQL me donne le résultat escompté.

    Je note aussi que
    .executeQuery()
    et
    .executeUpdate()
    donnent le même résultat, comportement dont je ne sais pas s'il est normal ou pas.... bref

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

Discussions similaires

  1. CREATE TABLE .... AS SELECT
    Par blids dans le forum SQL
    Réponses: 5
    Dernier message: 13/10/2016, 14h00
  2. Create Table Select from avec Primary Key
    Par argyronet dans le forum SQL
    Réponses: 2
    Dernier message: 18/11/2008, 09h49
  3. Surveiller 'CREATE TABLE AS SELECT'
    Par mjag dans le forum Administration
    Réponses: 4
    Dernier message: 26/12/2006, 11h42
  4. Réponses: 2
    Dernier message: 28/07/2006, 14h48
  5. "Create table..." à partir d'un "select"
    Par TraPpeur dans le forum Access
    Réponses: 3
    Dernier message: 21/11/2005, 12h23

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