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

  1. #1
    Membre du Club Avatar de Franck2mars
    Inscrit en
    Mai 2003
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2003
    Messages : 119
    Points : 64
    Points
    64
    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 éminent
    Avatar de Ditch
    Inscrit en
    Mars 2003
    Messages
    4 160
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mars 2003
    Messages : 4 160
    Points : 9 634
    Points
    9 634
    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.

    Didier Danse

    Most Valuable Profesionnal SharePoint
    Microsoft Certified Application Developer
    Mes articles sur developpez.com
    Mon site perso


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

    Informations forums :
    Inscription : Mai 2003
    Messages : 119
    Points : 64
    Points
    64
    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 régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 68
    Points : 80
    Points
    80
    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 du Club Avatar de Franck2mars
    Inscrit en
    Mai 2003
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2003
    Messages : 119
    Points : 64
    Points
    64
    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 : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    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.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

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

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

  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 : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    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.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  9. #9
    Membre du Club Avatar de Franck2mars
    Inscrit en
    Mai 2003
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 43

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

  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 : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    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.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  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 : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    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 ?

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 68
    Points : 80
    Points
    80
    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.

  13. #13
    Membre du Club Avatar de Franck2mars
    Inscrit en
    Mai 2003
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2003
    Messages : 119
    Points : 64
    Points
    64
    Par défaut
    pardon, c sql server 2K

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

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    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.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

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

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par Franck2mars
    pardon, c sql server 2K
    Oki.

    Donc essaye en transac, tu vas voir, ca va tout de suite être mieux, j'en suis presque sur

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  16. #16
    Membre du Club Avatar de Franck2mars
    Inscrit en
    Mai 2003
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2003
    Messages : 119
    Points : 64
    Points
    64
    Par défaut
    Et comment ca se met en oeuvre? j ai jamais fait de transac en vbnet

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

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par Franck2mars
    Et comment ca se met en oeuvre? j ai jamais fait de transac en vbnet
    Ben de la même maniére qu'en C# ou qu'avec n'importe quel langage en .Net.

    - appeler méthode BeginTransaction sur l'instance de connection
    - positionner l'instance de l'objet Transaction récupérée sur le retour de BeginTransaction dans la propriétés ad-hoc de l'instance de l'objet Command
    - à la fin appeler la méthode Commit sur l'instance de l'objet Transaction.

    Vous pouvez peut être quand même chercher un peu tout seul pour des choses aussi triviales.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  18. #18
    Membre du Club Avatar de Franck2mars
    Inscrit en
    Mai 2003
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2003
    Messages : 119
    Points : 64
    Points
    64
    Par défaut
    ok merci

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

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par Franck2mars
    ok merci
    De rien.

    Et ce serait intéressant de poster le résultat des courses, aprés vos essais.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

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