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

 MySQL Discussion :

Remplir une table pour faire des tests


Sujet :

MySQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2010
    Messages : 11
    Points : 15
    Points
    15
    Par défaut Remplir une table pour faire des tests
    Bonjour à tous,

    Pour m'habituer à mysql, j'ai choisi de travailler à partir de Terminal (mac os X).
    Mes débuts sont pitoyables, je dois réécrire 10 fois mes lignes de code pour ne pas faire d'erreur de syntaxe mais je m'accroche ;-)
    Pour faire des tests de performance, je voudrais créer des millions enregistrements par code, et là, je coince, je ne trouve rien à copier-comprendre-coller sur le Web :-(
    Quelqu'un peut me donner un petit coup de pouce ?

    merci.
    V.

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 285
    Points : 11 740
    Points
    11 740
    Par défaut
    Supposons par exemple que tu veuilles remplir la table suivante avec quelques millions de lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CREATE TABLE Trucmuche (
      ID INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
      Categ CHAR(3) NOT NULL,
      DateEntree DATE NOT NULL,
      Salaire INT NOT NULL
    ) ;
    On va construire une vue de 10 millions de lignes permettant de générer du volume (c'est bcp + rapide que de faire des boucles allant de 0 à 9 millions...), et des fonctions de génération aléatoire selon le type.

    1) Volume

    0n va commencer par créer une table contenant les chiffres de 0 à 9 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CREATE TABLE Chiffres (Num TINYINT NOT NULL PRIMARY KEY) ;
    INSERT INTO Chiffres (Num) VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9) ;
    Maintenant, il suffit de faire une série de produits cartésiens pour créer une table de 10 millions de lignes (par ex. sous forme de vue pour alléger la base) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE VIEW DixMillions AS
    SELECT U.Num + 10 * D.Num + 100 * C.Num + 1000 * M.Num
      + 1E4 * DM.Num + 1E5 * CM.Num + 1E6 * Mi.Num AS Num
    FROM Chiffres U
      CROSS JOIN Chiffres D
      CROSS JOIN Chiffres C
      CROSS JOIN Chiffres M
      CROSS JOIN Chiffres DM
      CROSS JOIN Chiffres CM
      CROSS JOIN Chiffres Mi ;
    2) à partir de la fonction RAND, on va créer des fonctions de génération pour les différents types :

    Celle des entiers, qui servira de base aux autres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE FUNCTION GEntier(Mini INT, Maxi INT, Intervalle INT) 
    RETURNS INT
    RETURN Mini + (RAND() * (Maxi - Mini) DIV Intervalle ) * Intervalle ;
    Celle des dates, qui est une simple dérivée de la précédente :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE FUNCTION GDate(Mini DATE, Maxi DATE)
    RETURNS DATE
    RETURN Mini + INTERVAL GEntier(0, DATEDIFF(Maxi, Mini), 1) DAY ;
    Et voici pour un code de trois lettres aléatoires (le caractère 65 est le A, 90 le Z) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE FUNCTION GCateg()
    RETURNS VARCHAR(3)
    RETURN CONCAT(CHAR(GEntier(65, 90, 1)), CHAR(GEntier(65, 90, 1)), CHAR(GEntier(65, 90, 1))) ;

    3) Je peux maintenant remplir ma table TrucMuche avec dix millions de lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO Trucmuche (Categ, DateEntree, Salaire)
    SELECT GCateg(), GDate('2008-01-01', CURDATE()), GEntier(2000, 4000, 100) 
    FROM DixMillions ;

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2010
    Messages : 11
    Points : 15
    Points
    15
    Par défaut
    Super... par copier-coller de ton code cela marche, il me reste à comprendre.
    Heureusement que j'ai une semaine de congé et que le temps est maussade ;-)
    Mon valeureux macbook a quand même mis 10 minutes pout générer ces 10.000.000 de lignes et le tout prend 200 Mo sur le disque ;-)

    V.

  4. #4
    Membre confirmé Avatar de Jérémie A.
    Profil pro
    Inscrit en
    Août 2008
    Messages
    270
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2008
    Messages : 270
    Points : 450
    Points
    450
    Par défaut
    Merci pour cet exemple Antoun, j'avais justement besoin de quelque chose du genre.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 12/06/2014, 18h47
  2. Réponses: 4
    Dernier message: 20/06/2011, 03h01
  3. Réponses: 2
    Dernier message: 11/05/2009, 20h04
  4. Réponses: 3
    Dernier message: 21/01/2009, 19h14
  5. [SQL] Récupération éventuelle d'une variable pour faire des tests
    Par mougeole dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 24/05/2006, 14h56

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