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 :

Test Access Python Postgresql


Sujet :

PostgreSQL

  1. #1
    jnore
    Invité(e)
    Par défaut Test Access Python Postgresql
    Salut à tous,

    Avez-vous déjà essayé de compter le nombre d'insertion que PostgreSQL est apte à recevoir à la seconde?
    Pour ma part j'ai essayé avec Access et Python.

    J'ai crée une petite boucle qui va insérer 10000 fois mon nom dans un champ de table.
    Certes mon pc serveur n'est pas fortiche mais cela me permet de comparer les applications clientes.

    Mon serveur est équipé d'un sempron 2400 et de 512mo de ram. A noter que le disque dur est un disque de portable qui tourne à 4200trs/min (bref c pas le top)
    Mon réseau est constitué d'un routeur Netgear DG834G

    Voici le script en ADO( sous access)

    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
    Function testrapide()
    Dim cnx As New ADODB.Connection
    Dim rs As New ADODB.Recordset
    Dim cmd As New ADODB.Command
    Dim chaine As String
     
    chaine = "DRIVER={PostgreSQL ANSI};SERVER=u10791;port=5432;DATABASE=invest3;" _
    & " UID=postgres;PWD=blabla;A0=0;A1=6.4;A2=0;A3=0;A4=0;A5=0;A6=;A7=100;A8=4096;A9=0;" _
    & "B0=254;B1=8190;B2=0;B3=0;B4=1;B5=1;B6=0;B7=1;B8=0;B9=1;" & "C0=0;C1=0;C2=dd_"
     
    cnx.ConnectionString = chaine
    cnx.Open
    cmd.ActiveConnection = cnx.ConnectionString
     
    'définition de la requete
        Dim req As String
        req = "insert into commandes.""CONNECTION"" (nom) values ('JNO');commit"
     
    'définition des variable de temps
        Dim depart As Date
        Dim fin As Date
     
    cmd.CommandText = req
    'enregistrement de l'heure de départ
    depart = Now()
    ' séquence d'insertion des 10000
        For i = 1 To 10000
            Set rs = cmd.Execute
        Next
    'enregistrement de l'heure de fin
    fin = Now()
     
    MsgBox depart & "      " & fin
     
    cnx.Close
    Set cnx = Nothing
    Set cmd = Nothing
    Set rs = Nothing
     
    End Function
    Voici le script par odbc (j'utilise une requête programmée sous Access que je commande en VBA)Function rapide2()

    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
    Dim depart As Date
    Dim fin As Date
     
     
    'enregistrement de l'heure de départ
    depart = Now()
    ' séquence d'insertion des 10000
    DoCmd.SetWarnings False
    	For i = 1 To 10000
    	DoCmd.OpenQuery ("req")
    	Next
    DoCmd.SetWarnings True
    'enregistrement de l'heure de fin
    fin = Now()
     
    Debug.Print depart, " ", fin
    End Function
    Voici le script en python

    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
    # -*- coding: cp1252 -*-
    import psycopg2
    import datetime
    db = psycopg2.connect("dbname='invest3' user='postgres' password='blabla' host='u10791' port='5432'")
     
    cursor = db.cursor()
    req= "insert into commandes."'"CONNECTION"'" (nom) values ('JNO');commit"
    a=1
    b=datetime.datetime.now()
     
    while a<=10000:
        cursor.execute(req)
        a=a+1
    c=datetime.datetime.now()
    print b,"     ",c
    A noter que j'ai fait un test aussi en convertissant le fichier access mdb en mde (code compilé);voici les résultats:

    secondes Moyenne Enr/s
    ODBC 95 105
    ADO(mdb) 47 212
    ADO(mde) 47 212
    Python 46 217
    Python compilé en exe 46 217

    Conclusion:
    Mon serveur est minable
    La faute n'est pas à Postgresql du moins je ne pense pas!
    J'ai testé en otant le réseau, c'est-à-dire en mettant les applications sur le pc serveur. Je gagne quelques secondes mais c'est pas extraordinaire.
    Je m'attendais à ce que Python fasse bcp mieux qu'access, en fait c'est identique.
    Autre chose, s'il faut éviter un mode de transfert de données, c'est bien ODBC. Certes la facilité est là mais bon…
    Quelqu'un a-t-il déjà essayé ce test?
    Quelle config faut-il pour passer à 1000 enregistrements par seconde?
    Quelles sont les limites de Postgresql? Ne dépend-il que du matériel qui le supporte?

    Merci pour vos commentaires.
    Dernière modification par jnore ; 07/01/2007 à 07h51.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par jnore
    Salut à tous,

    req = "insert into commandes.""CONNECTION"" (nom) values ('JNO');commit"

    drôle de syntaxe sql… et un commit sans 'begin' ?

    un simple test - 8.0.3 sous FDC3, programme en C, accès à la DB via IP - localhost sur une config similaire (CP et RAM mais avec un disque IDE à 7200 T/min …) - donne pour 10000 insertions sur une table sans index ( "INSERT INTO commandes(nom) VALUES('JNO')" )

    user 0m0.340s
    sys 0m0.310s

    soit 0.650 sec pour 10000 records ou 15384 records par seconde au niveau CPU…

    le temps réel perçu par l'utilisateur dépendra évidemment de la charge de la machine…

    (NB dans ce cas-ci l'utilisation de PREPARE n'apporte pas grand chose mais ce n'est pas nécessairement le cas de tous les INSERT…)

  3. #3
    jnore
    Invité(e)
    Par défaut
    en vba il faut doubler les "" sinon ca ne fonctionne pas; Pareillement le
    commandes correspond au schema


    Ceci dit comment fais-tu pour être aussi rapide?

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par jnore
    en vba il faut doubler les "" sinon ca ne fonctionne pas; Pareillement le
    commandes correspond au schema
    :P

    Ceci dit comment fais-tu pour être aussi rapide?
    #include <stdio.h>
    #include <libpq-fe.h>

    // cc -o testins -L/opt/local/lib -I/opt/local/include -lpq testins.c

    int main(int argc, char **argv)
    {
    int i ;

    PGconn *conn = PQconnectdb("YOUR_CONNECTION_STRING_HERE") ;
    if (PQstatus(conn) != CONNECTION_OK)
    {
    PQfinish(conn);
    fprintf(stderr, "# *** Can't connect to db\n") ;
    return 1 ;
    }

    for(i=0;i<10000;i++) {
    PGresult *result ;

    result = PQexec( conn, "INSERT INTO commandes(nom) VALUES('JNO')" );
    PQclear(result) ;
    }

    PQfinish(conn);
    return 0 ;
    }

  5. #5
    jnore
    Invité(e)
    Par défaut
    je ne connais pas trop ce langage mais comment calcules-tu ton temps entre le début des 10000 insertions et la fin?
    J'ai l'impression que le délai que tu annoncais dans ton post précédent correspond à 1 insertion et non au temps d'insertion des 10000

    Je me trompe?

    Merci de me répondre

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par jnore
    je ne connais pas trop ce langage mais comment calcules-tu ton temps entre le début des 10000 insertions et la fin?
    J'ai l'impression que le délai que tu annoncais dans ton post précédent correspond à 1 insertion et non au temps d'insertion des 10000

    Je me trompe?

    Merci de me répondre
    les temps donnés correspondent à l'exécution totale du programme via la commande

    time ./testins

    user correspond au temps passé dans le code "utilisateur" du programme
    sys correspond au temps passé dans les appels "système"

  7. #7
    jnore
    Invité(e)
    Par défaut
    J'ai crée une boucle d'insertion en pl/pgsql sur la meme table et le meme champ.....Ca n'a rien à voir!!!

    J'insère 100 000 enregistrements en moins de 5s

    Par contre j'ai constaté que lorsque j'insère le meme nbre de données sur une table qui contient d'autres champ, cela ralentit le traitement!!
    Jusqu'à 6 fois dans mon cas!!

    voici le code
    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
    CREATE OR REPLACE FUNCTION "public"."f1" () RETURNS SETOF bit AS
    $body$
    /*
     
     */
    DECLARE
           a integer;
     
    BEGIN
     a=1;
     while a<100000 loop
     insert into "T00" (nom) values ('JNO');
     a=a+1;
    END loop;
    END;
    $body$
    LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;

Discussions similaires

  1. Réponses: 0
    Dernier message: 09/01/2008, 18h58
  2. [Python+PostgreSQl] lenteur de requêtes
    Par guestCam dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 08/08/2007, 13h41
  3. access et postgresql
    Par attavus dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 31/05/2006, 13h37
  4. migration de bases access vers postgresql
    Par passie dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 04/07/2005, 11h12
  5. Access et PostgreSQL
    Par nic_moq dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 25/03/2004, 10h40

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