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

VB.NET Discussion :

Conseil d'optimisation


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Franck2mars
    Inscrit en
    Mai 2003
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Mai 2003
    Messages : 119
    Par défaut Conseil d'optimisation
    Salut a tous,

    je suis en train de faire un programme qui fait des insertions en base. je me pose une question quant à l'optimisation,

    est-ce mieux d'ouvrir la connexion avant d'exécuter une procédure stockée et de la refermer apres chaque exécution.
    Ou est ce mieux d'ouvrir la connexion avant de lancer toutes les procédures stockées et de refermer une fois que toutes les insertions en base ont été effectuées. J'ai des performances assez pourries, je comprends pas.
    Je mets une moyenne de 10' pour insérer 1000 lignes à 39 champs.....
    Qu'en pensez vous?

  2. #2
    Expert confirmé
    Avatar de Ditch
    Inscrit en
    Mars 2003
    Messages
    4 160
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mars 2003
    Messages : 4 160
    Par défaut
    Citation Envoyé par Franck2mars
    Salut a tous,

    je suis en train de faire un programme qui fait des insertions en base. je me pose une question quant à l'optimisation,

    est-ce mieux d'ouvrir la connexion avant d'exécuter une procédure stockée et de la refermer apres chaque exécution.
    Ou est ce mieux d'ouvrir la connexion avant de lancer toutes les procédures stockées et de refermer une fois que toutes les insertions en base ont été effectuées. J'ai des performances assez pourries, je comprends pas.
    Je mets une moyenne de 10' pour insérer 1000 lignes à 39 champs.....
    Qu'en pensez vous?
    Tu peux ne l'ouvrir qu'une fois et a fermer à la fin. Utilises un try/catch/finally pour éviter de laisser la connexion ouverte si une exception est lancée.

  3. #3
    Membre confirmé Avatar de Franck2mars
    Inscrit en
    Mai 2003
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Mai 2003
    Messages : 119
    Par défaut
    C'est exactement ce que je fais :

    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
    Public Function Execute_ProcStock(ByRef connexion As ADODB.Connection, ByRef rs_insertion As ADODB.RecordsetClass, ByVal i As Integer) As Integer
            ' Exécution d'une Procédure Stockée de type Insertion ou Update 
            Dim MonResultat As Integer = -1
            Dim rang As Integer
            Dim MaCommande As String
            Try
                MaCommande = "ps_I_AddMERGE_DATA "
                If i = 0 Then
                    rang = 1
                Else
                    rang = 2
                End If
                MaCommande &= EntreCote(LTrim(Mid(tablo(i), rang, taille_PURCH_ORG))) & ","
                rang += taille_PURCH_ORG
                .....
     
                rs_insertion.Open(MaCommande, connexion)
            Catch ex As Exception
                If Not (connexion Is Nothing) Then connexion.Close()
                MonResultat = -1
            Finally
                If Not (connexion Is Nothing) Then connexion.Close()
            End Try
    est ce bien d envoyer la connection et le recordset par adresse?

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 68
    Par défaut
    il me semble que de toute façon si tu fermes ta connexion et que tu la réouvre par la suite ça ne dégage pas des pertes excessives de performances vu que la connexion est gardée dans une sorte de pool, donc elle est gardée en mémoire et très rapidement réouverte.

    Concernant tes problèmes de performances ça me semble pas choquant vu la quantité de données à insérer. Si c'est vraiment un problème, tu peux changer de méthode d'insertion en utilisant par exemple la méthode par bulk insert, ou un truc du style.

  5. #5
    Membre confirmé Avatar de Franck2mars
    Inscrit en
    Mai 2003
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Mai 2003
    Messages : 119
    Par défaut
    Tu as un exemple de bulk insert?

  6. #6
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par SuperB
    Concernant tes problèmes de performances ça me semble pas choquant vu la quantité de données à insérer.
    Désolé, mais je ne suis pas d'accord (du tout).

    Si on multiplie par 1000, cele ferait quasi 3 heures pour insérer 1 000 000 de lignes, ce qui serait complétement délirant.

  7. #7
    Membre confirmé Avatar de Franck2mars
    Inscrit en
    Mai 2003
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Mai 2003
    Messages : 119
    Par défaut
    c ce que je pense, c affreux.... surtout que je dois le faire par la suite sur 2 millions de lignes

  8. #8
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par Franck2mars
    c ce que je pense, c affreux.... surtout que je dois le faire par la suite sur 2 millions de lignes
    J'ai précisément là une appli qui travaille avec des 1 à 5 millions de lignes en INSERT et je ne suis pas du tout dans ces temps (c'est en minutes : de 3 à 15, suivant le SGBD et la quantité).

    Sinon, je réitére ma question supra : type de SGBD ?

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 68
    Par défaut
    Citation Envoyé par Bluedeep
    Désolé, mais je ne suis pas d'accord (du tout).

    Si on multiplie par 1000, cele ferait quasi 3 heures pour insérer 1 000 000 de lignes, ce qui serait complétement délirant.
    je parlais par rapport à la méthode utilisée... pour moi du ligne à ligne c'est lent par nature.

  10. #10
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par SuperB
    je parlais par rapport à la méthode utilisée... pour moi du ligne à ligne c'est lent par nature.
    Non, si c'est dans une transaction, ca ne change presque rien dans la pratique.
    Ici c'est lent vraissemblablement du fait du choix de la transaction implicite, choix que je trouve douteux dans le cas qui nous occupe.

  11. #11
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Bonjour

    Citation Envoyé par Franck2mars
    Salut a tous,

    je suis en train de faire un programme qui fait des insertions en base. je me pose une question quant à l'optimisation,

    est-ce mieux d'ouvrir la connexion avant d'exécuter une procédure stockée et de la refermer apres chaque exécution.
    Ou est ce mieux d'ouvrir la connexion avant de lancer toutes les procédures stockées et de refermer une fois que toutes les insertions en base ont été effectuées. J'ai des performances assez pourries, je comprends pas.
    Je mets une moyenne de 10' pour insérer 1000 lignes à 39 champs.....
    Qu'en pensez vous?
    Que c'est très très lent !

    Quel est le SGBD utilisé ?

    Sinon, une solution (suivant le SGBD) est de faire ce genre d'insert massif au sein d'une seule transaction. Tel que c'est codè, là, il y a visiblement utilisation de la transaction implicite de la procstoc, donc une transaction pour chaque insert, ce qui n'est pas optimal du tout.

    Pour ce qui est de la connection, le mieux est de n'en utiliser qu'une pour ce genre d'action.

    F.

  12. #12
    Membre confirmé Avatar de Franck2mars
    Inscrit en
    Mai 2003
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Mai 2003
    Messages : 119
    Par défaut
    donc, le mieux c de faire une seule transaction pour l exec de toutes mes proc stockees?

  13. #13
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par Franck2mars
    donc, le mieux c de faire une seule transaction pour l exec de toutes mes proc stockees?
    Je n'ai pas dit cela en général mais dans le cas ici, oui, clairement :

    - Entrer en transaction
    - Boucle d'insertion
    - Commit

    et Rollback si exception : ainsi tu t'assure que l'insertion est soit complète soit non effectuée.

Discussions similaires

  1. PreparedStatment : conseils pour optimiser mon code
    Par Monkey_D.Luffy dans le forum JDBC
    Réponses: 8
    Dernier message: 30/05/2008, 13h49
  2. Quelques conseils pour optimiser ma base
    Par Kaimite dans le forum Débuter
    Réponses: 0
    Dernier message: 11/05/2008, 10h14
  3. Conseils pour optimiser une PS
    Par PickEpique dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 10/08/2007, 11h49
  4. Réponses: 2
    Dernier message: 17/08/2006, 11h49
  5. Réponses: 4
    Dernier message: 26/01/2006, 10h35

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