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

Requêtes PostgreSQL Discussion :

MySQL vs PostgreSQL - Résultat très bizarre sur insertion


Sujet :

Requêtes PostgreSQL

  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2002
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 11
    Points : 6
    Points
    6
    Par défaut MySQL vs PostgreSQL - Résultat très bizarre sur insertion
    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 !

  2. #2
    Futur Membre du Club
    Inscrit en
    Juin 2002
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    Pour info, le problème était que sur ma version de code pour PostgreSQL chaque insert crée une transaction donc BEGIN INSERT COMMIT. Il est donc nécessaire d'indiquer explicitement une seule transaction pour tous les INSERT ce qui donne un code dans le genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    conn=PQconnectdb&#40;"dbname=db user="user"&#41;;  
      if &#40;PQstatus&#40;conn&#41; == CONNECTION_OK&#41; &#123; 
          res=PQexec&#40;conn,"BEGIN"&#41;; 
          for &#40;i=0;i<=10000;i++&#41; &#123;  
               &#91;...&#93; 
          &#125; 
          res=PQexec&#40;conn,"COMMIT"&#41;; 
      &#125;
    J'obtiens dans ce cas, un temps de 5 secondes (2 fois moins rapide que MySQL tout de même mais 6 fois plus que précedemment !).

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 741
    Points : 52 454
    Points
    52 454
    Billets dans le blog
    5
    Par défaut
    Cela s'explique facilement parce que MySQL ne gère pas les transactions.

    Autrement dit pas de journal ou écrire dedans avant l'insertion définitive...

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Futur Membre du Club
    Inscrit en
    Juin 2002
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    Dernière précision, dans l'exemple pris ici, une transaction avec 10000 lignes c'est beaucoup (prend bcp de RAM et gros fichier de log) ! Il vaut mieux essayer de le fragmenter avec par exemple 1000 lignes max.

  5. #5
    DrQ
    DrQ est déconnecté
    Membre expérimenté
    Avatar de DrQ
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    388
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 388
    Points : 1 515
    Points
    1 515
    Par défaut
    De plus avec MySQL ce n'est qu'une écriture en fin de fichier.
    Avec PostgreSQL tu as tout un moteur qui tourne derrière.
    Tu fais le même test sous Oracle ou SQL Server tu seras peut être plus lent encore. Mais il faut voir à terme ce que ça donne :
    - nombre d'utilisateurs simultané
    - quantité de données
    - complexité de la base
    - complexité des requêtes réalisées
    - etc...

    SQLPro a réalisé un article la dessus fort intéressant qui explique pas mal de choses.
    1)http://www.developpez.com/cours/
    2)Recherche
    3)Posez votre question en suivant les règles
    _oOo-DrQ-oOo_

Discussions similaires

  1. [MySQL, PostGreSQL] Récupérer les max sur une jointure
    Par genova dans le forum Langage SQL
    Réponses: 3
    Dernier message: 12/12/2017, 16h25
  2. Datetime + Mysql problème sur insertion
    Par hirochirak dans le forum ASP.NET
    Réponses: 12
    Dernier message: 08/12/2008, 18h34
  3. [MySQL] memory limit sur insertion dans MySQL
    Par bru2336 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 13/11/2007, 09h32
  4. MySQL: obtenir les résultats de la dernière insertion
    Par TNorth dans le forum Requêtes
    Réponses: 2
    Dernier message: 31/05/2006, 18h44
  5. Réponses: 4
    Dernier message: 28/09/2002, 01h00

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