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 :

Temps d'exécution requête Access très très long


Sujet :

Requêtes et SQL.

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 149
    Points : 183
    Points
    183
    Par défaut Temps d'exécution requête Access très très long
    Bonjour à tous,

    Je fais appel à vous car j'ai un problème de temps d'execution d'une requête sous Access et peut être quelqu'un sait comment "optimiser" celle-ci.

    Tous les mois, je récupère une extraction de la base des contrats à partir du logiciel de gestion des contrats que j'importe dans Access. Mon problème intervient lorsque je veux la comparer avec la base du mois précédent. Ci-dessous les différentes étapes:
    - Requête 1 : j'ajoute une clé primaire (concaténation de 3 champs) sur la table "BASE CONTRATS N-1"
    - Requête 2 : j'effectue la même requête sur la table "BASE CONTRATS N"
    - Requête 3 : Je chercher à savoir les contrats pour lesquels le montant a augmenté d'un mois sur l'autre. je lie mes 2 requêtes entre elles et je demande la liste des contrats présents dans la table "N" sui le sont aussi dans table "N-1" avec les montants pour les 2 mois. (cf. ci-dessous).


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT [PF N avec Clé Primaire].[Clé primaire], [PF N avec Clé Primaire].Montant, [PF N-1 avec Clé Primaire].Montant
    FROM [PF N avec Clé Primaire] LEFT JOIN [PF N-1 avec Clé Primaire] ON [PF N avec Clé Primaire].[Clé primaire] = [PF N-1 avec Clé Primaire].[Clé primaire];
    Pb : les 2 tables font environ 75000 lignes et le temps d'execution est très très très long, voire même plante avant d'arriver à son terme. Si quelqu'un peut m'aider sur le sujet, je lui en serais très reconnaissant.

    merci d'avance

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Bonjour,

    Les clés primaires sont-elles de vraies clés primaires, je pense notamment à l'indexation des champs clés primaires ?

    Concrêtement, comment crées-tu ces champs clés primaires ?

    Peux-tu nous montrer la (ou les) requête(s) ou procédures que tu emploies ?
    L'ajout de la colonne clé primaire est-il effectué "à la main" ou par une requête ?

    Citation Envoyé par tranzebou Voir le message
    les 2 tables font environ 75000 lignes et le temps d'execution est très très très long, voire même plante avant d'arriver à son terme. Si quelqu'un peut m'aider sur le sujet, je lui en serais très reconnaissant.
    Qu'entends-tu par <<très très très long>> ?
    1 minute, 1 heure, 1 jour...

    Néanmoins 75000 jointures ce n'est pas la mer à boire...

    Travailles-tu en local ou sur un serveur de fichiers ???
    _

  3. #3
    Membre expérimenté
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Points : 1 535
    Points
    1 535
    Par défaut
    Bonjour,
    essaie peut-être:

    Pour l'exemple j'appelle ContratCour la table des contrats du mois courant, ContratPrec la table des contrats du mois précédent, Champ1,Champ2,Champ3 les 3 champs servant à créer les clé primaires.

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT CC.Champ1 & CC.Champ2 & CC.Champ3 As [Clé Primaire], CC.Montant, '+' & CC.Montant-CP.Montant As [Gain]
    FROM [ContratCour] As CC INNER JOIN [CourantPrec] As CP ON CC.Champ1 & CC.Champ2 & CC.Champ3=CP.Champ1 & CP.Champ2 & CP.Champ3
    WHERE CC.Montant>CP.Montant;

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 149
    Points : 183
    Points
    183
    Par défaut
    JBO, je fais bien la concaténation de la clé primaire dans une requete et son résultat donne bien un identifiant unique pour ma table !!

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT [Contrat] & "-" & [Service] & "-" & [Site] AS [Clé primaire], [BASE PORTEFEUILLE].Etat, [BASE PORTEFEUILLE].Montant
    FROM [BASE PORTEFEUILLE];

    En revanche, je travaille sur serveur (j'ai copié le fichier sur mon disque pour faire un test donc à voir !!) et quand je dis long c'est en heures (ex : j'ai stoppé le programme aujourd'hui après 5H de traitement...)

    Enfin, mes tables ont chacunes 30 colonnes, cela peut-il avoir un impact important au niveau du temps de traitement ??

    Ilank l'idée a l'air bonne !! je vais essayer de l'adapter et vous tenir au courant

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Citation Envoyé par tranzebou Voir le message
    JBO, je fais bien la concaténation de la clé primaire dans une requete et son résultat donne bien un identifiant unique pour ma table !!

    En revanche, je travaille sur serveur (j'ai copié le fichier sur mon disque pour faire un test donc à voir !!) et quand je dis long c'est en heures (ex : j'ai stoppé le programme aujourd'hui après 5H de traitement...)
    Si je comprends bien, la jointure est effectuée entre 2 requêtes sur des champs calculés (ce que tu appelles clé primaire).

    Dans ce cas, la contre-performance n'a rien d'étonnant parce que le moteur de bases de données d'Access n'effectue aucune optimisation à ta place.
    il ne va pas:
    (1) créer des tables de travail temporaires,
    (2) ni indexer les champs utilisés pour la jointure.

    Alors ou tu achètes un super SGBD qui fera tout à ta place, ou bien tu te charges de ces optimisations.

    Pour avoir une idée des gains que tu peux espérer, je te suggérer de modifier tes 2 tables en leur ajoutant un véritable champ indexé et qui sera renseigné au préalable avec le résultat de la concaténation.

    Puis tu adaptes ta requête pour effectuer la jointure sur ces "vrais champs" et tu l'exécutes... je pense qu'elle s'exécutera en moins de 15 minutes et sans planter.

    Tentant n'est-ce pas ?
    _

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 149
    Points : 183
    Points
    183
    Par défaut
    Citation Envoyé par =JBO= Voir le message
    Pour avoir une idée des gains que tu peux espérer, je te suggérer de modifier tes 2 tables en leur ajoutant un véritable champ indexé et qui sera renseigné au préalable avec le résultat de la concaténation._
    Tout d'abord merci JBO de t'intéresser à mon cas.

    Effectivement la jointure est effectuée sur 2 champs calculés, mais je travaille à partir d'un fichier .csv extrait par un traitement informatique sans clé primaire et que je ne peux pas modifier en amont...
    Quant à saisir les 75000 identidiants manuellement c'est impensable.
    Est-ce qu'une requete de création de table pour ajouter ma "clé primaire" me permettrait d'éviter cette "moulinette" et de faire une jointure "performante" ??,

  7. #7
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Citation Envoyé par tranzebou Voir le message
    Quant à saisir les 75000 identidiants manuellement c'est impensable.
    Je crois que dans notre formidable société moderne, on délocaliserait volontiers ce genre de besoin: saisir 75000 identifiants !

    Trêve de plaisanterie...

    Citation Envoyé par tranzebou Voir le message
    Effectivement la jointure est effectuée sur 2 champs calculés, mais je travaille à partir d'un fichier .csv extrait par un traitement informatique sans clé primaire et que je ne peux pas modifier en amont...
    [...]
    Est-ce qu'une requete de création de table pour ajouter ma "clé primaire" me permettrait d'éviter cette "moulinette" et de faire une jointure "performante" ??,
    Effectivement, tu pourrais commencer par là.

    Pour chacun de tes fichiers CSV:
    * utiliser une requête création de table qui utilise le fichier CSV et le complète par un champ supplémentaire destiné à servir de clé qui reçoit la concaténation;
    * si tu laisses faire Access, le champ clé ne sera pas indexé, donc tu dois basculer la table en mode création et indexer le champ clé, puis tu sauves.

    Puis tu reconstruis ta requête sur ces 2 tables, tu l'exécutes et... tu reçois le fruit de ton labeur !

    Quand tu seras au point sur la démarche, tu pourras envisager une démarche plus propre. Mais un pas après l'autre, si tu veux bien.
    _

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 149
    Points : 183
    Points
    183
    Par défaut
    J'ai effectivement utilisé une requête de création de table et les résultats de la requête sont maintenant quasiment instantanés (même sur le réseau !!!).

    Pour résumé :
    - requête 1 : Requete création de table ("N") ou je reprends tous mes champs de la table d'origine et où j'ajoute ma clé primaire
    - requête 2 : même traitement avec la table "N-1"
    - requete 3 : je joins mes 2 tables crées précédemment via la clé primaire et je fais quelques opérations dessus (calculs, tris...)

    Et tout fonctionne très rapidement, que du bonheur !!!

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

Discussions similaires

  1. [WD14] Temps d'exécution requête
    Par ecoinfo dans le forum WinDev
    Réponses: 18
    Dernier message: 25/02/2010, 19h27
  2. Calcul de temps dans une requète Access 2003
    Par payou70 dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 03/08/2009, 18h19
  3. Temps d'exécution requête Access très long
    Par roman33 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 16/06/2009, 11h01
  4. Temps exécution requête d'insertion très long
    Par delphine93 dans le forum SQL
    Réponses: 9
    Dernier message: 12/12/2008, 17h41
  5. Réponses: 2
    Dernier message: 04/04/2006, 11h46

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