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)
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
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 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
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
A noter que j'ai fait un test aussi en convertissant le fichier access mdb en mde (code compilé);voici les résultats:
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
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.
Partager