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

Bases de données Delphi Discussion :

Access et lenteur


Sujet :

Bases de données Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2004
    Messages : 149
    Points : 69
    Points
    69
    Par défaut Access et lenteur
    Bonjour,

    J'ai une application qui utilise une BD Access (5 tables). J'alimente tous les jours cette BD de milliers de données. La taille est déjà de 70Mo. Le temps de transfert (insertion) est toujours plus long voir ennuyeux : pour 10'000 données d'une table à 7 colonne environs 2min.

    Est-ce un problème lié à ma base Access ?
    Dois-je utiliser une autre BD (MySql ou autre) qui traiterait mes données plus rapidement ?
    Ou alors utiliser un système par fichier ?

    Merci de vos conseils.

  2. #2
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Le problème de lenteur peut aussi venir du code qui permet l'insertion dans la base de données.
    Comment fais tu le transfert des données ?
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2004
    Messages : 149
    Points : 69
    Points
    69
    Par défaut
    par des requêtes SQL avec ADOQuery

  4. #4
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Tu peux montrer ton code ?
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2004
    Messages : 149
    Points : 69
    Points
    69
    Par défaut
    J'utilise une 50aines de requêtes. en voilà une

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Insert Into T_TEMPS
    (temps_lap, temps_comp,temps_cardio, temps_entr_num, temps_type, temps_no, temps_fc)
    values (:ParamTempsLap,:ParamTempsComp,:ParamCardio,:ParamEntrNum,:ParamTempsType,:ParamTempsNo,:ParamTempsFC);

  6. #6
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Le mieux ca serait ton code complet de l'insertion dans les tables, car autant il y a peut être des optimisations possible à faire.

    Par exemple, au lieu d'un simple insert avec paramètres, on pourrait transformer cela en une requete insert avec un Select, ce qui ferait le transfert d'un lot de données au lieu de faire l'insertion d'un enregistrement à la fois.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2004
    Messages : 149
    Points : 69
    Points
    69
    Par défaut
    Table Athlète
    Table Entraînement
    Table Temps

    Quand j'ajoute mes données, je crée un nouvel entraînement qui lui-même contient des données en-tête par défaut.
    Je mets à jour ces données en-tête par la fonction UpdateBD (Requête update toute simple)

    Puis j'alimente la table Temps liée à mon entraînement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      // Fonction qui met à jour 
      UpdateBD;
    //  insertion des temps depuis une TList
      for i := 1 to FList.Count-1 do
      begin
        ptr_lap := FList.Items[i];
        InsertTempsBD;    // Ajoute mes temps selon requête données messages précédents
     
      end; // end for

  8. #8
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Donc tu fais 2 actions puis x pour ajouter x enregistements ?
    - Insert Entraimement
    - Update Entrainement
    - Insert x données

    Les données elles viennent d'où ?
    fichier texte ?
    Base de données ?
    De l'espace ?

    Il faudrait que tu donnes un peu plus d'info, pas des petits bouts par-ci par-la, comment as tu codé UpdateBD, pareil pour InsertTempBd ?
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2004
    Messages : 149
    Points : 69
    Points
    69
    Par défaut
    Toutes les données proviennent d'une TList. Cette TList est une structure Record (en-tête de l'entraînement et données entraînement)

    Dans ma table Access, j'ai 3 tables (athlètes, entraînement et temps)

    Lorsque l'utilisateur descend les données depuis son appareil, cela alimente ma TList.

    J'ajoute un entraînement dans la table entraînement avec une reqûete SQL qui insère l'entête entraînement de la TList.

    Dans cette entête de l'entraînement (dans BD) des données doivent être notifiées par l'utilisateur c'est pourquoi j'effectue un update de différent champ de la Table entrainement (procedure UpdateBD).

    J'alimente ensuite ma table Temps (jointure avec Table entraînement) avec procedure InsertBDTemps

    // Ajout entête entraînement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO T_ENTRAINEMENT (entr_vers_chip, entr_no_dossard, entr_nb_lap, entr_date, entr_heure, entr_tps_tot, entr_assiste, entr_tps_assiste, entr_temps_arret_auto, entr_tps_safety, entr_nb_lap_radio, entr_distance, entr_compensation, entr_mode, entr_tps_zone5, entr_tps_zone4, entr_tps_zone3, entr_tps_zone2, entr_tps_zone1, entr_poids,entr_fcrepos, entr_athle_num)VALUES (:ParamVersChip,:ParamDossard,:ParamNbLap,:ParamDate,:ParamHeure,:ParamTempsTot,:ParamAssiste,:ParamTempsAssiste,:ParamArretAuto,:ParamSafety,:ParamRadio,:ParamDistance,:ParamComp,:ParamMode,:ParamZone5,:ParamZone4,:ParamZone3,:ParamZone2,:ParamZone1,:ParamPoids,:ParamFCrepos,:ParamAthlenum);
    // Mise à jour base de données
    UpdateBD;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE T_ENTRAINEMENT
    SET entr_disc_nom=:ParamNomDisc,entr_comment=:ParamComment,entr_compensation=:ParamCompensation,entr_poids=:ParamPoids,entr_fcrepos=:ParamFcRepos  
    WHERE entr_num=:ParamNum;
    // Ajout des données dans la table Temps
    for i := 1 to FList.Count-1 do
    begin
    ptr_lap := FList.Items[i];
    InsertTempsBD;
    end; // end for

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Insert Into T_TEMPS
    (temps_lap, temps_comp,temps_cardio, temps_entr_num, temps_type, temps_no, temps_fc)
    values (:ParamTempsLap,:ParamTempsComp,:ParamCardio,:ParamEntrNum,:ParamTempsType,:ParamTempsNo,:ParamTempsFC);

    Voilà le cheminement

  10. #10
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par Vodkha
    J'ajoute un entraînement dans la table entraînement avec une reqûete SQL qui insère l'entête entraînement de la TList.

    Dans cette entête de l'entraînement (dans BD) des données doivent être notifiées par l'utilisateur c'est pourquoi j'effectue un update de différent champ de la Table entrainement (procedure UpdateBD).
    Pourquoi faire un insert puis un update alors qu'il serait plus simple de faire un insert avec les données directement modifiée ? (enfin si ca se fait tout en direct sans pause)

    Est ce que tu utilises les transactions ? (begintrans, commit, etc ...)

    Est ce que tu compactes de temps en temps la base de données ?
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  11. #11
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    il faut reconstruir tes table:
    atlete
    type des entrainement (code,nom)
    entrainemnt atlete avec temp (code_atlete,code_entrainement,temp)

    car surment l'atlete ne fait pas tt les entrainement,
    en plus pas l'apene d'ajouté a chaque fois les nom des entrainement,,non???
    bah c'est un opinion pas plus
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2004
    Messages : 149
    Points : 69
    Points
    69
    Par défaut
    Malatar tu parles de transactions. non je n'utilise pas ce genre de chose encore moins le compactage.

    Peux-tu m'indiquer leurs fonctions ?

  13. #13
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Le compactage permet d'optimiser la base de données Access, ca supprime vraiment les enregistrements (car un delete en ACCESS ne supprime pas les données, mais les "cache"), en clair ca nettoie ta base de données.
    Fait un test direct avec ACCESS, tu vas être surpris, autant ta table va reduire en taille. (Outils / Utilitaires de base de données / Compacter ... )

    Les transactions permettent un traitement securisé des données :
    - Par exemple si tu insères des données, mais qu'une erreur se produit tu peux tout annuler et rien ne sera inséré dans la base de données.
    - Ca evite les problèmes concurentiels entre plusieurs utilisateurs sur une même base de données. (Premier entrée premier servi)
    Plsu d'info : http://sql.developpez.com/sqlaz/techniques/#L1
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2004
    Messages : 149
    Points : 69
    Points
    69
    Par défaut
    Effectivement j'avais une base de 300Mo et elle a diminué à 48Mo. peux-tu me dire s'il est possible de compacter une BD par delphi.
    Exemple lorsque je quitte le programme.

  15. #15
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2004
    Messages : 149
    Points : 69
    Points
    69
    Par défaut
    J'ai trouvé qqch sur le site dev.....com je vais essayer.

    Sinon que penses-tu de mes requêtes ?

  17. #17
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par Vodkha
    J'ai trouvé qqch sur le site dev.....com je vais essayer.

    Sinon que penses-tu de mes requêtes ?

    Bin, ce sont des requetes basiques

    Le faites que les données viennent d'un record ralentie ton application car pour chacun tu dois faire un insert.
    Peut être qu'en utilisant les transactions tu gagneras quelques secondes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    AdoConnection.BeginTrans;
    try
    // tes insert
      AdoConnection.CommitTrans; // on valide si tout c'est bien passé
    Except on E:Exception do
      begin 
        Showmessage('Erreur lors de l''insertion des données : ' + E.Message);
        AdoConnection.RollbackTrans; // On annule tout car y a eu une erreur
      end;
    end;
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2004
    Messages : 149
    Points : 69
    Points
    69
    Par défaut
    merci pour les différentes remarques je vais tester les transactions et modifier un peu mes requêtes.

    encore 2 petites questions :

    1 en changeant de BD (exemple mysql) le temps sera-t-il encore diminué ?
    2 pour diminuer le temps au minimum dois-je opter pour le choix des fichiers texte ?

    Merci pour vos infos

  19. #19
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par Vodkha
    merci pour les différentes remarques je vais tester les transactions et modifier un peu mes requêtes.

    encore 2 petites questions :

    1 en changeant de BD (exemple mysql) le temps sera-t-il encore diminué ?
    2 pour diminuer le temps au minimum dois-je opter pour le choix des fichiers texte ?

    Merci pour vos infos
    1- Pas sur que tu gagnes en rapidité avec MySQL, de plus selon la version de MySQL , ca ne gère pas les transactions.
    2- Pas sur que les fichiers textes soit plus rapide car tu commences à avoir un gros volume de données pour de la gestion par fichier texte pur.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/07/2007, 02h08
  2. [EJB2.1 Entity] [BMP][Access] Lenteur ?
    Par Hikage dans le forum Java EE
    Réponses: 7
    Dernier message: 17/01/2006, 14h38
  3. Lenteur Access // type de base .mdb !
    Par Didier100 dans le forum Access
    Réponses: 8
    Dernier message: 05/01/2006, 16h13
  4. Lenteur lors de la lecture d'une base Access
    Par Lio590 dans le forum Bases de données
    Réponses: 6
    Dernier message: 16/11/2005, 13h24
  5. lenteur d'exécution d'Access à l'ouverture d'un form
    Par FlicEnFlac dans le forum Access
    Réponses: 1
    Dernier message: 25/10/2005, 21h45

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