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 et SQL. Discussion :

Optimisation traitement sql [AC-2010]


Sujet :

Requêtes et SQL.

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2013
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2013
    Messages : 34
    Points : 43
    Points
    43
    Par défaut Optimisation traitement sql
    Bonjour je m'attaque aujourd'hui à de l'optimisation de mon application.
    Bien qu'ayant lu la FAQ access concernant cette tâche, une question continue de me tarauder l'esprit:

    Optimise ton plus les traitements en passant par du sql directe (update [table] set ...) ou bien en passant par les objets DAO.RECORDSET

    exemple de code ci-dessus, lequel des traitements serait le lus optimisé et le plus rapide :
    bloc 1
    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
     
    Dim myRs As DAO.Recordset
         'Begin the transaction
         myWrk.BeginTrans
     
         'start an update throught the recordset
         Set myRs = myDb.OpenRecordset("Category")
         myRs.Filter = "category_id = " & Me.Id
         With myRs
             .Edit
             .Fields("Label") = Me.Label
             .Fields("Description") = Me.Description
             .Fields("TicketFlag") = Me.TicketFlag
             .Fields("UpdatedBy") = Me.UpdatedBy
             .Fields("UpdateDate") = Me.UpdateDate
             .Update
         End With
     
         'commit the transaction
         myWrk.CommitTrans dbForceOSFlush
     
         set myRs = nothing
    vs


    bloc 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Dim reqSQL As String
     
         reqSQL = "update [category] set [label] = '" & param label & '" where category_id = 1
         'Begin the transaction
         myWrk.BeginTrans
     
         Docmd.runSQL(reqSQL)
          'commit the transaction
         myWrk.CommitTrans dbForceOSFlush
     
         set myRs = nothing
    Je precise que pour un insert, il est dit que passer par un recordset prend le traitement plus rapide :

    L'utilisation d'un Recordset rend le traitement plus rapide.
    Il est possible que la différence soit due au fait que le Recordset travaille avec la mémoire avant d'écrire sur le disque, alors que n requêtes provoquent n accès disque.
    http://access.developpez.com/faq/?page=SQL#PerfReq

  2. #2
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 777
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 777
    Points : 58 179
    Points
    58 179
    Billets dans le blog
    42
    Par défaut
    bonjour,

    si tu avais des dizaines de milliers d'enregistrements à mettre à jour, on pourrait en discuter.

    Mais là c'est pour mettre à jour 1 enregistrement si j'ai bien compris, on ne va pas chipoter pour des pouièmes de microsecondes, non ?

    D'ailleurs tu as constaté une différence en essayant ?

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2013
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2013
    Messages : 34
    Points : 43
    Points
    43
    Par défaut
    je t'avouerai que c'est pour de la maj unique oui ^^. mais c'est pour dans le cadre d'évolution, après je n'ai pas effectué une comparaison des temps de calcul comme montré dans la faq, je le ferai si j'ai du temps de libre.

    Après au niveau des traitements des données j'ai remarqué que les ordres sql direct étaient un peu plus long si je découple l'application (backend sur le réseau et front end sur le poste client), notamment pour les maj de lot.

    Mais je donnerai un retour d'ici un mois si c'est toujours nécéssaire (même si je pense que l'update agis comme l'insert).

    Dois-je marquer le poste comme résolu ?

    Remarque pratique autre que je groupe ici (pour jne pas faire de multitude de discussion), j'ai remarqué que passer par le gestionnaire d'erreur de la base (champs null/indexés sans doublon, et remonté l'erreur capté) était plus rapide que de créer son propre gestionnaire d'erreur (une fonction qui vérifie si mes champs sont vides ou non), si jamais ca interesse quelqu'un.

  4. #4
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 063
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 063
    Points : 24 668
    Points
    24 668
    Par défaut
    Bonjour,

    Remarque pratique autre que je groupe ici (pour jne pas faire de multitude de discussion), j'ai remarqué que passer par le gestionnaire d'erreur de la base (champs null/indexés sans doublon, et remonté l'erreur capté) était plus rapide que de créer son propre gestionnaire d'erreur (une fonction qui vérifie si mes champs sont vides ou non), si jamais ca interesse quelqu'un.
    Logique. Dans un cas ton moteur de base de données lève une erreur d'un autre coté tu vérifies tes champs avec un langage interprété. C'est forcément moins rapide.

    Pour en revenir à tes interrogations, et je rejoins F-leb :
    Modifier 1 record par-ci par-là, un Edit/Update suffit.
    Modifier un ensemble de record il faut privilégie toujours la requête, le moteur de base de données sera toujours plus rapide, dans la mesure ; où tu n'écris pas une requête d'hérétique et/ou qu'elle n'utilise pas des clauses qui ne sont pas optimisables par le moteur -s'il en est capable.

    Une règle que j'ai vérifié depuis de nombreuses années :
    99% des problèmes se règlent avec SQL, le 1% restant est soit un problème de conception, soit une particularité métier.

    Regarde le tuto sur l'optimisation des applications sur mon espace perso.

    Cordialement,

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PHP 5.4] Optimisation des traitements (SQL)
    Par qltmi dans le forum Langage
    Réponses: 1
    Dernier message: 06/04/2013, 11h59
  2. Optimisation traitement SQL
    Par decisio dans le forum PL/SQL
    Réponses: 27
    Dernier message: 03/07/2012, 09h38
  3. [AC-2007] Optimisation de traitements SQL sous VBA
    Par C_Kloug dans le forum VBA Access
    Réponses: 9
    Dernier message: 06/10/2009, 13h22
  4. [SQL Server 2000] Optimisation traitement
    Par luimême dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 26/02/2008, 11h22
  5. [PL/SQL] Optimisation traitement
    Par nako dans le forum Oracle
    Réponses: 1
    Dernier message: 29/12/2005, 16h01

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