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

Accès aux données Discussion :

Insertion multiple : quelle solution?


Sujet :

Accès aux données

  1. #21
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 187
    Points : 73
    Points
    73
    Par défaut
    Citation Envoyé par calagan99 Voir le message
    Le gain est déjà significatif.
    Maintenant, 1 seconde par enregistrement c'est long, en effet.

    Avez-vous jeté un coup d'oeil aux optimisations possibles côté base de données ?

    D'autre part, je relance l'idée déjà émise : plutôt que de tenter un UPDATE puis un INSERT et de (ne pas) gérer l'éventuelle exception levée, pourquoi ne pas passer par une syntaxe MERGE qui :
    - fait le même boulot
    - sans générer d'erreur
    - et de façon optimisée.
    Car je ne sais pas le faire et que je n'ai pas trouvé d'exemple concret...
    Auriez vous un exemple à me soumettre?
    Cette syntaxe est elle compatible avec PostgreSQL?

  2. #22
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    Citation Envoyé par Gold.strike Voir le message
    C'est ce que je viens de tester, après avoir cherché plusieurs solutions sur internet.

    Je passe donc bien en paramètre un DataTable, ayant cette structure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    DataTable dtGroupTeam = new DataTable();
    dtGroupTeam.Columns.Add("teamid", typeof(long));
    dtGroupTeam.Columns.Add("groupid", typeof(long));
    dtGroupTeam.Columns.Add("roundid", typeof(long));
    je ne pensais pas à ça mais à passer une table en paramètre donc plusieurs colonnes avec plusieurs lignes comme ça tu n'appel qu'une seul fois ta proc stock, il faut juste vérifier que postgre gère les variables de type table et tu en crée une en c# donc (pour sql server c'est le type SqlDbType.Structured)

  3. #23
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 187
    Points : 73
    Points
    73
    Par défaut
    Citation Envoyé par youtpout978 Voir le message
    je ne pensais pas à ça mais à passer une table en paramètre donc plusieurs colonnes avec plusieurs lignes comme ça tu n'appel qu'une seul fois ta proc stock, il faut juste vérifier que postgre gère les variables de type table et tu en crée une en c# donc (pour sql server c'est le type SqlDbType.Structured)
    Je ne suis pas sur de pouvoir...
    Mais je crois qu'ici ca n'a aucun intérèt, puisque les données traitées ne viennent pas de notre base, mais d'un WebService appelé chez un prestataire.

    Donc après l'appel à ce WebService, je récupère un XML que je deserialize afin de pouvoir exploiter les données. C'est ensuite pour cela qu'on fait un UPDATE/INSERT : on ne sait pas si la donnée traitée est déja dans notre BDD ou si elle a été rajoutée chez les prestataire...

  4. #24
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    il n'existe pas de type table mais il y a le tableau, j'ai très bien compris ton problème, justement je te proposais de passer en paramètre un tableau pour éviter de rappeler plusieurs fois la même proc stock

    tu passe directement toutes tes informations à ta proc stock et ensuite tu fais des requêtes select dessus pour faire des update/insert

  5. #25
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 187
    Points : 73
    Points
    73
    Par défaut
    Ah d'accord au temps pour moi, c'est moi qui avait mal compris
    Par contre, comment mettre en "relation" les données du tableau, et la proécdure stockée?
    Faudrait il une deuxième procédure qui prenne en paramètre un tableau, et qui aappelle la première pour chaque ligne?
    Ou exsite t'il une méthode plus simple?

  6. #26
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    tu modifies ta procédure stockée pour qu'elle prenne en paramètre un tableau et de la tu fais le nécessaire pour faire un update ou un insert, après pour le faire en 2 proc stock pourquoi pas mais pas sur que c'est le plus rapide au niveau exécution mais surement le plus simple pour toi (ça devrait déjà être plus rapide que la solution actuel)

  7. #27
    Modérateur

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2007
    Messages
    1 996
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 996
    Points : 3 102
    Points
    3 102
    Par défaut
    Visiblement l'instruction "MERGE" n'existe pas sous PostgreSQL.
    Cela dit, tu peux regarder de ce côté pour une implémentation "équivalente"

  8. #28
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 187
    Points : 73
    Points
    73
    Par défaut
    Citation Envoyé par youtpout978 Voir le message
    tu modifies ta procédure stockée pour qu'elle prenne en paramètre un tableau et de la tu fais le nécessaire pour faire un update ou un insert, après pour le faire en 2 proc stock pourquoi pas mais pas sur que c'est le plus rapide au niveau exécution mais surement le plus simple pour toi (ça devrait déjà être plus rapide que la solution actuel)
    Aurais tu des exemples? J'ai trouvé un lien sur la documentation de npgsql, rubrique "Working with Arrays" : http://npgsql.projects.postgresql.or...serManual.html
    Mais ce n'est pas très clair pour moi, car ils ne passent pas les paramètres à une procédure...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    NpgsqlCommand command = new NpgsqlCommand("select :arrayParam", conn);
    command.Parameters.Add(new NpgsqlParameter("arrayParam", NpgsqlDbType.Array | NpgsqlDbType.Integer));
    command.Parameters[0].Value = a;
    Console.WriteLine(command.ExecuteScalar());
    Il faudrait donc que je passe en paramètre 1 tableau par paramètre utililisé par ma procédure stockée, et qu'ensuite je les parcoure depuis une boucle de la procédure stockée?

    En attendant, j'ai modifié la procédure stockée pour pouvoir loguer les éventuelles exceptions rencontrés dans la base de données, puisque la solution actuelle ne me permets pas de les faire remonter dans le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	EXCEPTION WHEN OTHERS THEN
    		curtime := 'now';
    		table_name := 'group_team';
    		error := cast(sqlstate as varchar);
    		request := 'team_id =' || cast(teamid as varchar) || ', group_id =' || cast(groupid as varchar) || ', round_id =' || cast(roundid as varchar);
    		INSERT INTO synchronisation_errors_logs("date", error, table_name, request) 
    		VALUES(curtime, error, table_name, request);
    		RETURN 0;
    N'y a t'il aucun moyen de faire remonter les exceptions avec le DataAdapter?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int recordsInserted = adpt.Update(dtGroupTeam);
    La valeur récupérée pour recordsInserted correspond systématiquement au nombre de lignes de mon tableau, même si certaines des lignes n'ont pas été inséres ou mises à jour...

  9. #29
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Points : 4 414
    Points
    4 414
    Par défaut
    Citation Envoyé par Er3van Voir le message
    Si c'est pour une question de performances, je dirais :
    • Utiliser des procédures stockées
    • Affiner le plan d’exécution (en créant des index?) de celles-ci via SSMS
    • Appel de ta procédure stockée N fois depuis la même connexion SQL


    Sinon, tu peux voir du côté Bulk SQL
    Je crois qu'il s'agit de PostGreSQL ici, n'est ce pas ?

    Découvrez la FAQ de MS SQL Server.
    La chance accorde ses faveurs aux esprits avertis !

  10. #30
    Membre chevronné Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Points : 2 227
    Points
    2 227
    Par défaut
    Citation Envoyé par Er3van Voir le message
    J'avais fait le postulat que la base était sur SQL Server... mais PL/pgSQL est aussi développé et te permettra a priori de faire la même chose.
    Oui, mais je ne l'ai compris que plus tard dans la discussion !
    One minute was enough, Tyler said, a person had to work hard for it, but a minute of perfection was worth the effort. A moment was the most you could ever expect from perfection.

    -- Chuck Palahniuk, Fight Club, Chapter 3 --

Discussions similaires

  1. Héritage multiple, quelle est la meilleure solution?
    Par thunderfear dans le forum Langage
    Réponses: 1
    Dernier message: 06/02/2010, 20h32
  2. [Constantes] Quelle solution adopter ?
    Par animageo dans le forum Général Java
    Réponses: 16
    Dernier message: 10/02/2005, 11h43
  3. INSERT multiples avec : rs.AddNew et .Update
    Par M.Zip dans le forum ASP
    Réponses: 4
    Dernier message: 03/12/2004, 15h53
  4. pb d'insertions multiples
    Par devalender dans le forum SQL
    Réponses: 2
    Dernier message: 14/07/2004, 14h49
  5. [Intranet] Quelle solution choisir ?
    Par stailer dans le forum Développement
    Réponses: 6
    Dernier message: 06/09/2003, 01h17

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