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 :

[Question] INSERT INTO


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2010
    Messages : 210
    Par défaut [Question] INSERT INTO
    Bonjour,

    J'aurai une petite question (remarque on est là pour ça )

    Qu'est ce qui est le plus rapide donc mieux ?

    Utiliser INSERT INTO avec plusieurs UNION ?
    ou bien
    Utiliser plusieurs INSERT INTO en parallèle ?

    Ceci bien sûr sur la même table.

    Merci pour vos différentes réponses.

    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
    36
    37
    38
    39
     
    INSERT INTO MaTablePrincipale
    (
       Champs1,
       Champs2,
       Champs3,
       ...
       ...
    )
    SELECT
       Champs1,
       Champs2,
       Champs3,
       ...
       ...
    FROM
       MaTable1
    UNION
    SELECT
       Champs1,
       Champs2,
       Champs3,
       ...
       ...
    FROM
       MaTable2
    UNION
    SELECT
       Champs1,
       Champs2,
       Champs3,
       ...
       ...
    FROM
       MaTable3
    UNION
    ...
    ...
    ...
    Ou
    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
     
    INSERT INTO MaTablePrincipale
    (
       Champs1,
       Champs2,
       Champs3,
       ...
       ...
    )
    SELECT
       Champs1,
       Champs2,
       Champs3,
       ...
       ...
    FROM
       MaTable1
    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
     
    INSERT INTO MaTablePrincipale
    (
       Champs1,
       Champs2,
       Champs3,
       ...
       ...
    )
    SELECT
       Champs1,
       Champs2,
       Champs3,
       ...
       ...
    FROM
       MaTable2
    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
     
    INSERT INTO MaTablePrincipale
    (
       Champs1,
       Champs2,
       Champs3,
       ...
       ...
    )
    SELECT
       Champs1,
       Champs2,
       Champs3,
       ...
       ...
    FROM
       MaTable3
    Ceci autant de fois en parallèle que nécessaire.

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Il y a deux syntaxes pour l'insertion de données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    INSERT INTO la_table (les_colonnes)
    VALUES (les_valeurs_1), (les_valeurs_2), (les_valeurs_n)
     
    INSERT INTO la_table (les_colonnes)
    SELECT des_colonnes
    FROM une_autre_table
    WHERE conition
    Si tu n'as qu'une ou quelques valeurs saisies par l'utilisateur, utilise la première syntaxe. Si tu as beaucoup de valeurs provenant d'autres tables, utilise la seconde.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2010
    Messages : 210
    Par défaut
    Justement c'est pour injecter les donner de différentes tables dans une même TablePrincipale.
    D'où l'utilisation que je faisais avec les UNION.
    Mais comme c'est un script qui est lancé très régulièrement j'ai donc besoin que l'injection se fasse très rapidement d'où ma question.
    Utiliser plusieurs script en parallèle qui injectent les données de différentes tables dans une même table ou bien utiliser un seul script utilisant UNION.
    De plus, UNION va injecter dans la TablePrincipale toutes les tables les unes à la suite des autres alors que le fait d'utiliser plusieurs scripts en paralèle va les injecter un peu comme les données arrivent.
    Tout est une question de choix afin que l'injection des différentes tables via script se fasse très rapidement.

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Tu ne peux pas faire des inserts "en parallèle". Une requête sera plus rapide à exécuter que plusieurs et une requête sera plus rapide qu'une union de requêtes, si tu as la possibilité d'éviter l'UNION.

    De plus, UNION va injecter dans la TablePrincipale toutes les tables les unes à la suite des autres alors que le fait d'utiliser plusieurs scripts en paralèle va les injecter un peu comme les données arrivent.
    Et alors ?

    Une table SQL est un ensemble. Il ne faut pas y chercher un ordre a priori. C'est lors des requêtes qu'on choisit l'ordre dans lequel on va récupérer les données.

    Et si tu décrivais plus concrêtement ton besoin ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre confirmé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2010
    Messages : 210
    Par défaut
    Une table SQL est un ensemble. Il ne faut pas y chercher un ordre a priori. C'est lors des requêtes qu'on choisit l'ordre dans lequel on va récupérer les données.
    Nous sommes bien d'accord là-dessus.


    Et si tu décrivais plus concrêtement ton besoin ?
    C'est justement ce que j'essaie d'expliquer.

    Actuellement, j'ai un script batch qui injecte les données de différentes tables vers MaTablePrincipale, ceci toutes les 30min
    La requête d'injection utilise UNION et donc les données dans MaTablePrincipale se retrouvent être les données des tables injectées les unes après les autres et ceci prend donc un certain tps.
    En gros l'UNION va injecter les données de la Table1 ensuite la Table2 puis la Table3, etc...
    On remarque donc que les données de la Table3 ne seront injectées que lorsque les données de la Table1 et Table2 seront, elles, complètement injectées. Ceci prend donc du tps.
    Le but de ma question était de savoir si le fait de lancer plusieurs script en parallèle va permettre de gagner du tps puisque du coup le CPU et la MaTablePrincipale se retrouverait pas mal chargée.
    En gros au lieu d'avoir les données des différentes tables les unes derrières les autres, plutôt les avoir toutes mélangées (celà n'a aucune importance comme tu le signales)

    Lancer en même tps les 3 requêtes INSERT INTO MaTablePrincipale .... ou bien une seule et unique requête INSERT INTO ... UNION... UNION.... UNION...
    Qu'est ce qui prendrait le moins de tps ?
    Je ne vois pas comment l'expliquer autrement là. :-(

  6. #6
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    j'ai un script batch qui injecte les données de différentes tables vers MaTablePrincipale
    On reste dans l'abstrait !
    Quel domaine est concerné ? Des voitures, des recettes de cuisine, des enquêtes d'opinion, des paniers de vente en ligne, des vols de compagnies aériennes, des productions de pièces industrielles... ?

    Alors restons dans l'abstraction et essayons de couper ce brouillard...

    Une requête UNION, c'est une requête SELECT... UNION SELECT....
    Donc ton insertion doit être de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    INSERT INTO laTablePrincipale (les_colonnes_à_alimenter)
    SELECT des_colonnes
    FROM une_table
    UNION
    SELECT d_autres_colonnes
    FROM une_autre_table
    Le SGBD va d'abord exécuter la requête SELECT UNION. Au passage, il va éliminer les éventuels doublons sinon il faut utiliser UNION ALL.
    Puis il va insérer l'ensemble résultat de la requête UNION dans la table principale. Alors va s'opérer la restructuration des index éventuels de la table principale, en une seule passe.

    Si tu fais une succession de requêtes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    INSERT INTO laTablePrincipale (les_colonnes_à_alimenter)
    SELECT des_colonnes
    FROM une_table;
     
    INSERT INTO laTablePrincipale (les_colonnes_à_alimenter)
    SELECT d_autres_colonnes
    FROM une_autre_table;
    Il va d'abord effectivement insérer les données de la première requête, remanier les index, puis insérer les données de la deuxième requête et remanier de nouveau les index. Logiquement, ça devrait prendre plus de temps. Surtout qu'entre les deux requêtes, si elles sont lancées successivement par un programme externe, il y a aura deux réponses du SGBD au programme pour dire que ça s'est bien déroulé ou que ça a planté, donc un temps de latence entre les deux requêtes.

    Mais au delà de ça, je me demande pourquoi tu as besoin de faire ça, surtout toutes les 30 minutes ?
    C'est de la consolidation de données sur un serveur central par rapport à des serveurs répartis ? Il existe des outils de réplication dans tous les bons SGBD. C'est parfaois pas de la tarte à mettre en oeuvre mais c'est sûrement plus optimisé que de le faire à la main.

    Bon, je suis toujours dans le brouillard quant à ton besoin !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

Discussions similaires

  1. [MySQL] question sur INSERT INTO
    Par drick35 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 11/07/2013, 17h16
  2. [REQUETE] Question requete 'insert into' avec select
    Par Jeannot dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 09/08/2007, 17h52
  3. Réponses: 5
    Dernier message: 19/10/2006, 14h28
  4. erreur SQL ...INSERT INTO
    Par naidinp dans le forum ASP
    Réponses: 20
    Dernier message: 18/09/2003, 11h38
  5. Insert Into + Date
    Par BoeufBrocoli dans le forum SQL
    Réponses: 10
    Dernier message: 13/08/2003, 11h23

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