Bonjour à tous,
J'effectue quelques tests pour passer une base de MySQL à PostgreSQL. Pour me fair ela main avec l'API C, j'ai réalisé un petit programme qui fait la même chose pour MySQL et PostgreSQL : 10000 insertion dans une base tout simple.
Le schéma de la base :
Le code MySQL :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 |-----------------|----------------------------------------------| | TEST | | id | auto_increment (ou serial pour postgreSQL) | | type_int | INT (ou integer) | | type_varchar | varchar(255) | | type_tinyint | tinyint | | type_text | text | |-----------------|----------------------------------------------|
L'équivalent PostgreSQL :
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 #define INSERTION "INSERT INTO test (type_int, type_varchar,type_tinyint,type_text) VALUES (%d,\'essai de chaine de caractère\',100,\'MAJUSCULES et minuscules\'" int main(int argc, char **argv) { MYSQL mysql; unsigned int i; char mquery(1000); MYSQL_RES *mysql_row; mysql_init(&mysql); if (mysql_real_connect(&mysql, NULL, "user", NULL, "bd", 0, NULL, 0)) { for (i=0;i<=10000;i++) { sprintf(mquery,INSERTION,i); if ((mysql_query(&mysql,mquery)!=0) { printf("sql query error (%s) : %s\n",mquery,mysql_error(&mysql)); mysql_close(&mysql); return 0; } } mysql_close(&mysql); } else { printf("sql connection error : %s\n",mysql_error(&mysql)); return 0; } return 0; }
Rien de bien méchant.
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 #define INSERTION "INSERT INTO test (type_int, type_varchar,type_tinyint,type_text) VALUES (%d,\'essai de chaine de caractère\',100,\'MAJUSCULES et minuscules\'" int main(int argc, char **argv) { PGconn *conn; unsigned int i; char mquery(1000); PGresult *res; conn=PQconnectdb("dbname=db user="user"); if (PQstatus(conn) == CONNECTION_OK) { for (i=0;i<=10000;i++) { sprintf(mquery,INSERTION,i); res=PQexec(conn,mquery); if (PQresultstatus(res)!= PGRES_COMMAND_OK) { printf("sql query error (%s) : %s\n",mquery,PQresultErrorMessage(res)); PQclear(res); PQfinish(conn); return 0; } } PQclear(res); PQfinish(conn); } else { printf("sql connection error : %s\n",PQerrorMessage(conn)); return 0; } return 0; }
Je lance donc ces programmes sur ma machine sous Debian avec MySQL 3.23.51 et PostgreSQL 7.2.1.
Temps pour réaliser les insertions sous MySQL : entre 1 et 2 secondes.
Temps pour réaliser les insertions sous PostgreSQL : entre 28 et 30 secondes !!!....
D'où mon problème et mon interrogation ! Y'a t-il quelque chose dans l'API C de PostgreSQL que je n'ai pas compris ? des subtilités lors de la configuration ? Je m'attendais à ce que PostgreSQL soit moins rapide mais 15x plus lent sur une requête simple ?!...
Merci pour tout commentaire, remarque et correction !
Partager