Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/12/2006, 18h07   #1
jnore
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
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 :
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 :
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 :
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.
  Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2006, 11h52   #2
Expert Confirmé
 
Homme
Inscription : septembre 2006
Messages : 2 291
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : septembre 2006
Messages : 2 291
Points : 2 738
Points : 2 738
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…)
JeitEmgie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2006, 12h06   #3
jnore
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
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?
  Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2006, 18h38   #4
Expert Confirmé
 
Homme
Inscription : septembre 2006
Messages : 2 291
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : septembre 2006
Messages : 2 291
Points : 2 738
Points : 2 738
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 ;
}
JeitEmgie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2006, 18h46   #5
jnore
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
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
  Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2006, 22h09   #6
Expert Confirmé
 
Homme
Inscription : septembre 2006
Messages : 2 291
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : septembre 2006
Messages : 2 291
Points : 2 738
Points : 2 738
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"
JeitEmgie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/12/2006, 00h32   #7
jnore
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
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 :
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;
  Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h08.


 
 
 
 
Partenaires

Hébergement Web