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

 PostgreSQL Discussion :

Insert PostgreSQL plus longue que mySql ou H2


Sujet :

PostgreSQL

  1. #1
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2009
    Messages : 25
    Points : 17
    Points
    17
    Par défaut Insert PostgreSQL plus longue que mySql ou H2
    Bonjour,

    Je suis entraint de faire des tests sur PostgreSQL et j'essaie de comprendre pourquoi postgre est 6 fois plus long que MySQL et 4 fois plus long que H2.

    Le test est réalisé en java (+JDBC), et consiste à envoyer 86400 lignes sur 300 tables (Une ligne est composé de 2 colonnes, BIGINT PRIMARY KEY et DOUBLE PRECISION).
    Ce sont 4 Threads qui sont chargés d'exécuter les INSERT dans des requêtes préparées (prepareStatement)le code est plus bas.

    J'ai lu http://www.postgresql.org/docs/8.1/s...me-config.html pour pouvoir modifier certain paramètre du serveur mais j'ai ne sais pas quel paramètres pourront avoir un impact sur les perfs pendant l'insert.

    Si vous pouvez m'orienter pour rendre ma requêtes plus rapide.
    Merci.


    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
    40
     
    @Override
            public void run()
            {
                double value = 0;
                int insertNb = 50;
                String query = "INSERT INTO Table%d VALUES";
                for( int i = 0; i < insertNb; ++i )
                {
                    query += "(?, ?),";
                }
                query = query.substring( 0, query.length() - 1 );
                try
                {
                    Connection conn = DriverManager.getConnection( dbURL );
     
                    while( begin++ != end )
                    {
                        long time = System.currentTimeMillis();
                        PreparedStatement stat = conn.prepareStatement( String.format( query, begin ) );
                        int count = 3600 * 24; //second dans une heure * heure * jours
                        while( count > 0 )
                        {
                            int index;
                            for( int i = 1; i <= insertNb; ++i )
                            {
                                index = i * 2;
                                stat.setLong( index - 1, count-- );
                                stat.setDouble( index, value += 0.5 );
                            }
                            stat.executeUpdate();
                        }
                    }
                    conn.close();
                }
                catch( SQLException ex )
                {
                    Logger.getLogger( Main.class.getName() ).log( Level.SEVERE, null, ex );
                }
            }

  2. #2
    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
    Si l'autocommit est à true, et je crois que c'est le cas par défaut, Il faudrait le passer à false sans quoi le serveur attend la confirmation d'écriture disque faite par chaque requête.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    conn.setAutoCommit(false);

  3. #3
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2009
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    j'ai déjà fait le test et ça n'a rien changé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    conn.setAutoCommit(false);
    stat.executeUpdate();
    conn.setAutoCommit(true);
    merci

  4. #4
    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
    C'est qu'il ne faut pas le remettre à true, il faut le laisser à false pendant toute l'exécution.
    Là je suppose que ça fait toujours un commit à chaque INSERT, ce qu'il faut éviter.

  5. #5
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2009
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    merci estofilo,
    ça a divise les temps par deux, par contre je trouve ça encore long. Postgre est un SGBD long ou rapide?

  6. #6
    Membre chevronné
    Avatar de kedare
    Homme Profil pro
    Network Automation Engineer
    Inscrit en
    Juillet 2005
    Messages
    1 548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Network Automation Engineer

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 548
    Points : 1 861
    Points
    1 861
    Par défaut
    Tu fais bien un "START TRANSACTION" au début et un "COMMIT" a la fin ?
    Si non oui sur des petits volumes c'est plus lent que Mysql, mais les performances diminuent beaucoup moins rapidement sur Mysql quand la charge ou le volume de données augmente (surtout si tu compare avec MyISAM sous Mysql qui n'est pas crash-safe et ne gère pas les transaction (donc suffit d'une coupure de courant pendant une modification des données et soit tu perd toute ta table ou tu te tape plusieurs heures de récupération)

    Il faut pas oublier que si tu est sous Windows, Postgresql est très lent ca concu pour fonctionner sous des systèmes compatible Unix (BSD/Linux), la version Windows sert juste pour le développement et les testes, elle souffre de gros problèmes de performances, il faut aussi savoir que Postgresql est a la base configuré pour utiliser le moins de ressources possible, et est donc loins d'etre a 100% de sa vitesse

  7. #7
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2009
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    Tu fais bien un "START TRANSACTION" au début et un "COMMIT" a la fin ?
    Non, pour l'instant je ne teste pas les transactions, c'est l'étape d'après


    Il faut pas oublier que si tu est sous Windows, Postgresql est très lent ca concu pour fonctionner sous des systèmes compatible Unix (BSD/Linux), la version Windows sert juste pour le développement et les testes, elle souffre de gros problèmes de performances, il faut aussi savoir que Postgresql est a la base configuré pour utiliser le moins de ressources possible, et est donc loins d'etre a 100% de sa vitesse
    c'est dans la doc ?

    merci kedare pour tes réponses.

    a+

  8. #8
    Membre chevronné
    Avatar de kedare
    Homme Profil pro
    Network Automation Engineer
    Inscrit en
    Juillet 2005
    Messages
    1 548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Network Automation Engineer

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 548
    Points : 1 861
    Points
    1 861
    Par défaut
    C'est pas dans la doc a ce que je sache, mais la version Linux/BSD est bien plus rapide car bon, Postgresql fonctionne sous Linux depuis toutes les premières versions (donc bien optimisé), alors que la version Windows existe depuis les la 8.0,

    Sans transactions tu aura de très mauvaises performances car Postgresql est prévu pour fonctionner avec

  9. #9
    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
    Non, pour l'instant je ne teste pas les transactions, c'est l'étape d'après
    Si car le fait d'exécuter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    conn.setAutoCommit(false);
    doit faire que le driver JDBC ouvre une transaction et fait les INSERT dans cette transaction.

  10. #10
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2009
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    Pour l'instant PostgreSQL n'est pas ce qu'il me faut.
    Je vais essayer MySql +Innodb et voir si je peu trouver d'autre base assez performante.

    Merci

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

Discussions similaires

  1. MySql sous Windows plus lent que MySql sous Unix/Linux
    Par randriano dans le forum Administration
    Réponses: 4
    Dernier message: 28/03/2014, 15h07
  2. Chaîne de caractères plus longue que prévu
    Par flachgreg dans le forum PL/SQL
    Réponses: 7
    Dernier message: 06/06/2012, 16h33
  3. Réponses: 2
    Dernier message: 07/08/2009, 12h42
  4. oracle plus lent que mysql avec des blobs
    Par ZashOne dans le forum Administration
    Réponses: 4
    Dernier message: 26/03/2009, 15h54
  5. Réponses: 1
    Dernier message: 03/04/2008, 01h34

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