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 :
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                                        |
|-----------------|----------------------------------------------|
Le code MySQL :
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;
}
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
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;
}
Rien de bien méchant.
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 !