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 :

[D5][FireBird][Debutant]Lenteur requete SELECT


Sujet :

Bases de données Delphi

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 8
    Points : 7
    Points
    7
    Par défaut [D5][FireBird][Debutant]Lenteur requete SELECT
    Bonjour,


    J'ai migré une base paradox en firebird, je débute sous Firebird.

    J'ai une table LIGF -> lignes de ventes qui contient 1 500 000 enrg avec des clés sur CODE_CLIENT et CODE_ARTICLE.

    J'ai développé un programme D5 qui contient une fiche client. Quand je change de client, j'affiche dans une DBGrid les lignes de ventes de ce client (donc sur l'évènement ondatachange du dataset j'effectue une requete SQL du genre SELECT CODE_ARTICLE, QTE, PRIX FROM LIGF WHERE CODE_CLIENT = '2095', en fait je récupère une vingtaine de champ de la table LIGF).

    L'exécution de cette requête prend environ 5 à 8 secondes (tout en étant seul sur la base), ce qui est trop lent pour mon client.

    Auparavent, avec les tables paradox, j'utilisais un setrange sur la table LIGF, et le setrange s'exécutait en même pas 1 seconde.

    Ici j'utilise le composant TIBQuery pour le SELECT. Je voudrais savoir si il y avait un moyen d'accélérer tout ça tout en sachant que le pb est peut-être matériel ?

    La config du serveur : P3 800Mhz, 256Mo RAM, Disque SCSI, Reseau 10Mb sous Linux, c'est peut-être très léger mais je n'ai pour l'instant qu'un seul poste en test, sinon quelle configuration faudrait-il par la suite pour une cinquantaine de postes ?

    Est-ce qu'en passant par un TIBTable, le traitement serait plus rapide ?

    Autre chose de bizarre, j'ai la possibilité de filtrer ces lignes sur un code article en particulier, donc j'execute cette même requête sur LIGF avec une deuxième condition dans le WHERE CODE_ARTICLE = 'XBOX', et ici la rêquete s'execute en moins d'une seconde ???

    Cette fiche client est assez utilisée et reste assez souvent ouverte (application MDI), est-ce que le composant TIBquery avec requête SQL select est-il adapté pour ce genre d'utilisation : la consultation ? Je me pose d'autant plus la question concernant le rafraîchissement des données. Comment rafraîchir de manière efficace ? Fermer et réouvrir la requête ? Y a-t-il un composant qui gère ça de façon automatique (afin d'éviter de passer par un bouton refresh ou un timer) ?

    J'ai encore une question, ce programme est une application MDI. J'ai une fenêtre principale et 2 fenêtres enfants qui sont la fiche client et la fiche article.
    Quand je passe d'une fenêtre à l'autre, il m'exécute à nouveau la requête TIBQuery (de façon automatique) et me perd la position dans la DBGrid, comment éviter cela ?

    Dernière question, quand j'exécute une requête TIBQuery, l'application est occupée (sablier...) et ne me rend la main qu'après retour du résultat de la requête, est-il possible que l'application me rende la main avant et qu'elle continue de me renvoyer les lignes résultantes de la requête (dans ma DBGrid) au fur et à mesure ?


    Merci d'avance. Un newbie sous Firebird.
    Benj2007.

  2. #2
    Membre éprouvé Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 14
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Points : 912
    Points
    912
    Par défaut
    Citation Envoyé par Benj2007
    avec des clés sur CODE_CLIENT et CODE_ARTICLE.
    Citation Envoyé par Benj2007
    SELECT CODE_ARTICLE, QTE, PRIX FROM LIGF WHERE CODE_CLIENT = '2095', en fait je récupère une vingtaine de champ de la table LIGF).
    Il faut que via un outils tels Wisql ou ibexpert ou autre tu controle le plan d'exécution de ta requête. Il est plus que probable que malgré ton index sur CODE_CLIENT ton mode d'écriture de la requête fasse que FireBird en utilise un autre.


    Citation Envoyé par Benj2007
    La config du serveur : P3 800Mhz, 256Mo RAM, Disque SCSI, Reseau 10Mb sous Linux, c'est peut-être très léger mais je n'ai pour l'instant qu'un seul poste en test, sinon quelle configuration faudrait-il par la suite pour une cinquantaine de postes ?
    Certes c'est léger, mais bon.

    Citation Envoyé par Benj2007
    Est-ce qu'en passant par un TIBTable, le traitement serait plus rapide ?
    Non

    Citation Envoyé par Benj2007
    dans le WHERE CODE_ARTICLE = 'XBOX', et ici la rêquete s'execute en moins d'une seconde ???
    Cette fois-ci le plan d'exécution est certainement correct du coup c'est rapide

    Citation Envoyé par Benj2007
    Quand je passe d'une fenêtre à l'autre, il m'exécute à nouveau la requête TIBQuery (de façon automatique) et me perd la position dans la DBGrid, comment éviter cela ?
    Il ne faut pas que tu fasses le Open de ta requêtes sur OnDataChange car cet évènement sqe déclenche souvent mais plutôt sur le afterscroll et n'utilise pas le mécanisme MasterField.
    De plus tu ne dois rafaichir que si tes clés ont changés ou si tu souhaites forcer le rafraichissement.
    Donc fait une fucntion pour gérer le changement de clé avec une sauvegarde et relocalisation de la position via Bookmark par exemple.

    Citation Envoyé par Benj2007
    est-il possible que l'application me rende la main avant et qu'elle continue de me renvoyer les lignes résultantes de la requête (dans ma DBGrid) au fur et à mesure ?
    Oui et non.
    Non tu n'auras pas la main avant que la requête soit terminée.
    Oui c'est possible mais alors tu dois lancer ta requete dans un thread, ceci dit ce thread ne pourra pas te donner d'informations avant que la requête soit terminée mais tu auras la main pour voir une grille vide et alors tu prends le risque que l'utilisateur profite d'avoir la main pour quitter la fenêtre par exemple.


    a+
    Dans le vocabulaire des couturiers seulement, patron est synonyme de modèle.
    Aymond d'Alost

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Merci Yurck de ta réponse, elle m'a aiguillée, car je viens de faire des tests.

    En fait ce n'est pas le temps d'éxecution qui est long, il est même assez rapide (de l'ordre de 100 à 200 ms), mais j'effectue sur le ondatachange un Last après l'ouverture de ma requête, et cette opération qui est très longue, donc je vais faire un ORDER descendant.

    Et encore merci.

    Benj2007.

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/05/2008, 08h02
  2. [debutant]SQL 2005 + requete select ?
    Par christopheEU dans le forum Développement
    Réponses: 1
    Dernier message: 04/04/2008, 14h26
  3. [debutant]SQL 2005 + requete select ?
    Par christopheEU dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 04/04/2008, 14h26
  4. [Debutant] Requete SELECT enregistrement NULL
    Par brak__ dans le forum Requêtes et SQL.
    Réponses: 16
    Dernier message: 22/12/2006, 16h03
  5. [Data] [Debutant] Requetes SELECT et Spring
    Par speedsweep dans le forum Spring
    Réponses: 2
    Dernier message: 04/09/2006, 16h06

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