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 :

lenteur lors de l'ouverture d'une table volumineuse


Sujet :

Bases de données Delphi

  1. #1
    Membre régulier Avatar de gregcat
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 155
    Points : 94
    Points
    94
    Par défaut lenteur lors de l'ouverture d'une table volumineuse
    quand je fais un table1.open sur une table de 300 000 enregistrements il met plus de 30 secondes à s'executer!

    je ne comprends pas pourquoi le temps d'ouverture a l'air proportionnel au volume de la table?

    il n'a pourtant pas de raison de parcourir toute la table pour l'ouvrir ?

  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
    C'est normal c'est le fonctionnement des composants base de données.
    Quand tu fais un Open, les données sont rapatriées sur le poste appelant, et le temps de transfert prendra plus ou moins de temps selon :
    • Le nombre d'enregistrement retourné
    • Le nombre de colonne retourné
    • Le type de champ retourné (un champ integer arrivera plus vite qu'un champ blob)
    • La vitesse de dialogue entre le client et le serveur (plus rapide sur du 100mbit que sur du 10mbit)
    • Etc...


    Le mieux est de faire des requetes paramètrées qui filtrent les données à l'affichage.
    Dans ce cas, il faut étudier le meilleur moyen de filtrer les données afin qu'elle soit facile d'accès à l'utilisateur.
    Modérateur Delphi

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

  3. #3
    Membre éclairé Avatar de slimjoe
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    Points : 789
    Points
    789
    Par défaut
    Bonjour!

    Citation Envoyé par Malatar
    C'est normal c'est le fonctionnement des composants base de données.
    Je ne suis pas tout à fait d'accord .

    J'utilise des bases Paradox et MSSQL volumineuses et quand mes composants TTable sont connectés à des alias natifs du BDE (comme le pilote STANDARD ou MSSQL et non des ODBC par exemple) le Open() ne retourne que les premiers enregistrements. Par contre, si on demande RecordCount ou que l'on fait Last(), ça gèle quelque secondes avant de donner la réponse.

    Quel SGDB utilises tu ? Via quel pilote ?

    Aussi (encore une fois ça mériterait un peu de tests) je crois qu'il est possible via ADO de laisser le curseur sur le serveur (CursorLocation := clUseServer) pour faire ce dont tu as besoin. Ça vient de l'aide de mon D7 (désolé, c'est en anglais) :

    A server-side cursor offers less flexibility, but may be more advantageous (or necessary) for large result sets.
    Bon dev!
    -Slimjoe

  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
    En VF

    Citation Envoyé par Aide Delphi Fr
    Utilisez CursorLocation pour indiquer si les curseurs qui utilisent l'objet connexion pour se connecter au stockage de données ADO utilisent une bibliothèque de curseur côté client ou côté serveur. CursorLocation n'affecte que les connexions ouvertes une fois la propriété initialisée. La valeur par défaut de CursorLocation est clUseClient.

    Un curseur côté client offre davantage de flexibilité. Toutes les données sont rapatriées sur la machine locale puis manipulées sur place ce qui permet des opérations que ne gèrent normalement pas les serveurs comme trier et retrier les données ou des filtrages supplémentaires. Les instructions SQL sont exécutées par le serveur, donc pour les instructions qui limitent l'ensemble de résultats à l'aide d'une clause WHERE, seul l'ensemble de résultats restreint est renvoyé au curseur local.

    Un curseur côté serveur offre moins de flexibilité mais il peut être plus avantageux (voire nécessaire) pour des ensembles de résultats volumineux. L'utilisation d'un curseur côté serveur devient nécessaire quand la seule taille de l'ensemble de résultats excède l'espace disque disponible qui serait nécessaire à la création d'un curseur côté client. De plus, de nombreux serveurs ne gèrent que des curseurs unidirectionnels. Cela interdit de déplacer en arrière le pointeur d'enregistrement dans l'ensemble de données (même d'un seul enregistrement) via l'ensemble d'enregistrements.
    De toute façon traiter de gros volume sans requete c'est pas ce qui se fait de mieux de nos jours.
    Modérateur Delphi

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

  5. #5
    Membre régulier Avatar de gregcat
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 155
    Points : 94
    Points
    94
    Par défaut
    Quel SGDB utilises tu ? Via quel pilote ?
    j'utilise pour l'instant une connexion en serveur local EasyPHP/MySql via les composants MyDAC..

    mais j'ai fait un essai sur la meme table en BDE/DBF, c'est environ le même temps d'ouverture sur ma table de 300 000 enregistrements

    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
    24
    25
    26
    27
    28
    29
      MyConnection1.Database:='rcfweb';
      MyConnection1.Username:='root';
      MyConnection1.Password:='';
      MyConnection1.Server:='localhost';
      try
        MyConnection1.Connect;
      except
        exit;
      end;
      if MyConnection1.Connected then
       IwMemo5.Lines.Add(datetimetostr(now)+' connecté à MySql');
    
      RCF_MyTable_Dossier.Connection:=myconnection1;
      rcf_datasource_dossier.DataSet:=RCF_MyTable_Dossier;
    
      RCF_MyTable_Fichier.Connection:=myconnection1;
      rcf_datasource_Fichier.DataSet:=RCF_MyTable_Fichier;
    
    
      begin //******************************* MySql ************ Table Dossiers
        RCF_MyTable_Dossier.TableName:='_rcf_dossier';
        try
          RCF_MyTable_Dossier.Open; <- ICI OU CA METS AU MOINS 20 SECONDES A S'OUVRIR (meme avec BDE/DBF)  
        except
           webapplication.Terminate('impossible d''ouvrir la table MySql:'+RCF_MyTable_Dossier.TableName);
        end;
        IwMemo5.Lines.Add(datetimetostr(now)+' table ouverte :'+RCF_MyTable_Dossier.TableName);
      end;

  6. #6
    Membre éclairé Avatar de slimjoe
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    Points : 789
    Points
    789
    Par défaut
    Citation Envoyé par gregcat
    j'utilise pour l'instant une connexion en serveur local EasyPHP/MySql via les composants MyDAC..
    Je ne crois pas qu'il existe de driver natif MySQL pour BDE .

    As-tu essayé la solution avec ADO et les curseurs serveur ?
    -Slimjoe

  7. #7
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    P'tite question : dans quel but ouvres tu donc toute la table ? Tu en fais quoi ensuite ?

  8. #8
    Membre expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Points : 3 329
    Points
    3 329
    Par défaut
    lorsque on ouvre des tables avec sont elle chargé en mémoire ou c'es l'enregistrement courant qui est chargé parce que moi j'ouvre toujour toutes mes tables au chargement de l'application.

  9. #9
    Membre éclairé Avatar de slimjoe
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    Points : 789
    Points
    789
    Par défaut
    Citation Envoyé par aityahia
    lorsque on ouvre des tables avec sont elle chargé en mémoire ou c'es l'enregistrement courant qui est chargé
    Ça dépend des fois (du pilote, tu type de curseur, etc.)


    Citation Envoyé par aityahia
    parce qyue moi j'ouvre toujour toutes mes tables au chargement de l'application.


    T'es certain que c'est la meilleure méthode ? Ici je rejoins Malatar à 100%: tu as probablement besoin de requètes...
    -Slimjoe

  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
    J'utilise moi-aussi les composants MyDac, et ils sont performant pour les bases de données MYSQL.
    Mais comme je l'ai dit plus haut le problème vient du fait que tu ouvres l'intégralité de ta table avec ces composants et qu'il faut du temps pour rapatrier les 300 000 enregistrements sur ton poste.


    Citation Envoyé par aityahia
    parce qyue moi j'ouvre toujour toutes mes tables au chargement de l'application.
    C'est bien pour la gestion mono-utilisateur d'une application, mais dès que ca devient multi-utilisateur tu vas être obliger de rafraichir ta table pour arriver à voir les enregistrements ajoutés par les autres utilisateurs et rafraichir une table de 300k enregistrements à longueur de temps, c'est pas ce qu'il se fait de mieux.


    Pour une application base de données souple, fiable et rapide, il n'existe qu'un moyen : les requetes
    De nos jours c'est indispensable de connaitre leur fonctionnement.
    Modérateur Delphi

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

  11. #11
    Membre expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Points : 3 329
    Points
    3 329
    Par défaut
    Citation Envoyé par Malatar
    C'est bien pour la gestion mono-utilisateur d'une application, mais dès que ca devient multi-utilisateur tu vas être obliger de rafraichir ta table pour arriver à voir les enregistrements ajoutés par les autres utilisateurs et rafraichir une table de 300k enregistrements à longueur de temps, c'est pas ce qu'il se fait de mieux.
    Exact j'e fait toujour des Requery dans mon code ce qui gèle mon application pour quelque second .

  12. #12
    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
    soit vous utlisés avec un dbgrid, soit qui est pas des champs calculé pas sûr!!!!?
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  13. #13
    Membre éclairé Avatar de slimjoe
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    Points : 789
    Points
    789
    Par défaut
    Citation Envoyé par edam
    soit vous utlisés avec un dbgrid, soit qui est pas des champs calculé pas sûr!!!!?
    Pardon?
    -Slimjoe

  14. #14
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut
    Je serais intéressé de savoir si
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Table1.Active := False;
    Table1.Active := True;
    prend autant de temps que

  15. #15
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Citation Envoyé par defluc
    Je serais intéressé de savoir si
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Table1.Active := False;
    Table1.Active := True;
    prend autant de temps que
    C'est exactement la même chose, dans le sens où la méthode Open du TDataSet bascule la propriété Active à True (et inversement Close bascule Active à False).

    @+ Claudius

  16. #16
    Membre expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Points : 3 329
    Points
    3 329
    Par défaut
    ou
    ou
    prenent toutes le meme temps.

  17. #17
    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
    Citation Envoyé par edam
    soit vous utlisés avec un dbgrid, soit il y a des champs calculé pas sûr!!!!?
    si il y a des champs calculé et une dbgrid, surement le dbgrid va lire tout les ligne,non???
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  18. #18
    Membre régulier Avatar de gregcat
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 155
    Points : 94
    Points
    94
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ADOTable1.CursorLocation := adUseServer;
    je pense que avec cette propriété : CursorLocation ca devrait le faire pour ouvrir rapidement une table de plus de 300k enregistrements .... ( enfin maintenant j'en ai plus de 3000k )

    mais avec MyTable de MyDAC je ne vois pas cette propriété ... !?

  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
    Normal vu qu'elle n'existe pas avec ce composant

    Soit tu passes par des requetes, soit tu changes de composants.

    Après il faut voir s'il est nécessaire de devoir ouvrir l'intégralité de la table dès le début ?
    Tu ne peux pas filter (via une requete) par date ou une période de date, une catégorie, etc ... ?
    Modérateur Delphi

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 08/03/2012, 22h47
  2. [WS 2008] Lenteur extrême lors de l'ouverture d'une session après migration AD2008
    Par Vlacar dans le forum Windows Serveur
    Réponses: 0
    Dernier message: 23/08/2011, 16h39
  3. [AC-2003] "ODBC -- Appel échoué" lors de l'ouverture d'une table sql dans access
    Par benoit27 dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 25/06/2009, 10h50
  4. Lors de l'ouverture d'une table, insérer la date de dernière maj
    Par whitespirit dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 25/06/2008, 10h52
  5. Erreur lors de l'ajout d'une table
    Par FredMines dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 27/07/2005, 13h13

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