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 :

Requête très longue sur table liée AS/400 [AC-2003]


Sujet :

Requêtes et SQL.

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 25
    Points : 11
    Points
    11
    Par défaut Requête très longue sur table liée AS/400
    Bonjour à tous,

    Je travaille depuis plusieurs semaines sur un fichier Access qui intègre une interface permettant de calculer des prix de revient. J'utilise des requêtes sur des tables liées sur un AS/400 pour récupérer des infos en direct sur la production de l'entreprise.

    Toutes mes requêtes sont rapides (temps < 1s et souvent <0.1s) sauf une qui met près de 10s pour répondre. Cela me porte à près de 2 min le temps de réponse lorsque je clique sur le bouton de génération de mon prix.

    Comment faire pour améliorer cette piètre performance ?

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Comment veux-tu que les membres du forum puissent t'aider ?

    Tu ne nous donne pas la requête, ni les tables, il y a peut-être une optimisation à faire, mais sans plus d'informations

    Philippe

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    Voilà mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO T_achattemp ( ACPROD, ACDATE, ACDESI, ACPRIU )
    SELECT PGMTEST_FLAC0026.ACPROD, PGMTEST_FLAC0026.ACDATE, PGMTEST_FLAC0026.ACDESI, PGMTEST_FLAC0026.ACPRIU
    FROM PGMTEST_FLAC0026
    WHERE (((PGMTEST_FLAC0026.ACPROD) Like [temp]));
    j'utilise un paramètre...

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    L'élément qui prend du temps est bien cette requête, je l'ai isolée en mode débeugage.

    C'est vrai la table PGMTEST_FLAC0026 comporte 234 000 élts mais cela ne m'a pas posé problème pour d'autres tables similaires.

  5. #5
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Et si tu remplaces le like par un égal ?

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    Merci de la proposition, malheureusement cela ne change pas le temps de réponse.

    Par contre, ce qui est amusant, c'est qu'en début de journée, les requêtes sont très longues et qu'au plus on fait d'accès, au plus elles sont rapides. J'imagine que cela est dû au fait que je compacte la base de donnée à la fermeture de l'application et qu'elle grossit au fur et à mesure qu'on l'utilise.

    Si ça vous donne des idées, je suis preneur...

    Merci d'avance

    Cortek's

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour

    La table PGMTEST_FLAC0026, n'est elle pas souvent sollicitée par la gestion de ton application As400, par les travaux planifiés, ou par des query?

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    C'est à dire ? Je ne comprends pas bien.

    C'est une table utilisée par de nombreuses personnes dans l'entreprise mais c'est le cas de beaucoup d'autres tables que j'utilise dans mon application.

    Par ailleurs j'y fais une petite cinquentaine d'accès pour construire un prix, soit un clic dans mon interface. Cela est également le cas pour d'autres tables que j'utilise.

    Et quelle corrélation avec la diminution des tps de requêtes de mon application ?

  9. #9
    Invité
    Invité(e)
    Par défaut
    Désolé
    Je demandais cela car je sais par exemple qu'en arrivant dans l'entreprise, des commerciaux peuvent envoyer des querys de stats , le font en interactif au lieu de batch, et les perfs de l'As chutent. Dans ce cas les perfs des requêtes externes basées sur les mêmes tables chutent également, tout au moins, c'est ce que j'ai pu constater. Mais ce n'est qu'une hypothèse.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    Merci en tout cas pour l'idée !

  11. #11
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Bonjour,

    Et en attaquant directement le serveur plutôt que de passer par des tables liées ?


  12. #12
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Chtulus Voir le message
    Bonjour,

    Et en attaquant directement le serveur plutôt que de passer par des tables liées ?

    Je serai assez d'accord avec Chtulus.
    Pourquoi ne pas plutôt ouvrir une connexion par exemple en Ado, alimenter ta table Access et fermer ta connexion.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    Et bien je ne connais pas Ado mais je vais lire les tutos et essayer de mettre ça en application...

    Je vous tiens au courant.

    Merci

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    En fait, si je comprends bien, je me connecte à l'AS via le DSN que j'utilisais déjà pour mes tables liées mais je configure moi-même ma connection. Je peux donc choisir le type de curseur (comme avant) mais aussi sa position.

    Et donc je dois pouvoir gagner en performances en testant différents paramètres de curseurs ?

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    Après divers essais, j'en arrive à la conclusion suivante :

    La sélection de ma requête avec un curseur localisé sur le serveur et un type asOpKeyset est ultra rapide. Cela me permet de sélectionner une trentaine d'enregistrements. Je ne veux récupérer que celui correspondant à la date la plus récente (il y a un champ date).

    Seulement, je n'arrive pas à passer cela en paramètre de sélection dans une requête car la date est notée dans un champ numérique (jjmmaa) mais donc si la date est 01/01/01, on a 10101, le premier zéro n'existe pas.

    Du coup, pour le moment, je suis obligé de parcourir tous les enregistrements et c'est cela qui prend du temps.

    Comment faire pour faire une requête directe ?

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    Je me suis souvenu d'un truc que j'ai lu sur le forum : appliquer des fonctions directement sur les champs dans l'écriture de la requête. Ca pourrait donner quelque chose de ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT Max(CDbl(cdate(Left(ACDATE,Len(ACDATE)-4) 
                                / Mid(ACDATE,Len(ACDATE)-3,2) 
                                / Right(ACDATE,2)))),FLAC0026.ACPROD 
    FROM FLAC0026 
    GROUP BY FLAC0026.ACPROD 
    HAVING (ACPROD) = temp
    Je convertis en date le champ de l'AS400, puis je le converti en numérique pour pouvoir sélectionner le max.

    Le problème est que j'obtiens une erreur du driver ODBC qui ne connait pas les fonctions en question.

    Enfin je cherche une solution pour pouvoir sélectionner directement avec une requête sans lire toutes les données.

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    Et bien faute de solution formidable, j'ai importer deux champs de la table dans une table locale qui est mise à jour tous les jours.

    Je fais ma requête sur la table locale contenant le code article et la date et j'utilise le résultat de cette requête pour faire une autre requête avec ADO avec un curseur sur le serveur pour récupérer tous les champs de l'enregistrement désiré. Je gagne ainsi énormément de temps en execution puisque je ne cherche qu'un seul enregistrement sur le serveur.

    Voilà, si vous avez des commentaires, n'hésitez pas.

    Merci à ceux qui ont proposé des solutions.

  18. #18
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 017
    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 017
    Points : 24 547
    Points
    24 547
    Par défaut
    Si cela peut t'aider.

    Eviter de faire des Cast dans les requêtes, la base de données native réagit bien par contre beaucoup d'autres base de données semblent ne pas apprécier et mettent plus de temps à s'exécuter.

    Les fonctions VBA ne sont exploitable que dans l'environnement direct d'ACCESS, inutile de les envoyer au serveur sans les traduire en SQL propre au serveur.

    Regarde le tuto sur l'optimisation des applications access sur ma page perso. Il y a peut être quelque chose qui t'aidera.

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

Discussions similaires

  1. Requète sur tables liées
    Par VTLE34 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 27/06/2012, 10h17
  2. [AC-2007] Requête sur tables liées : pas de doublons
    Par junty dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 30/12/2011, 10h53
  3. [AC-2007] Requête ajout sur tables liées à partir de tables liées
    Par pierrequimousse dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 10/03/2010, 16h36
  4. Requête très longue sur une table très simple
    Par kragenskul dans le forum Requêtes
    Réponses: 6
    Dernier message: 16/06/2009, 14h28
  5. Requête sur table liée non nulle
    Par MistyMan dans le forum Requêtes
    Réponses: 4
    Dernier message: 06/02/2009, 12h44

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