Bonjour
J'ai créé une nouvelle requête dans ma base de données, mais le temps de traitement est trop long (une bonne quinzaine de secondes).
Je sais bien que cela est dû à la conception de la requête, mais je ne vois pas comment faire autrement.
Voici les tables :
Tous les champs commençant par Id sont de type Numérique/Entier Long.
Les clés primaires sont indéxées sans doublons.
Les clés étrangères sont indexées avec doublons.
La table TZPersonnes recense les personnes et contient 180 enregistrements.
La table TContrats recense les contrats des personnes et contient 200 enregistrements. Certaines personnes ont eu des évolutions et ont ont eu plusieurs contrats successifs. Le champs DateEffet indique à partir de quand le nouveau contrat est effectif. Les dates vont du 01/01/2010 au 12/02/2024 (des contrats prendront effet la semaine prochaine).
La table TPlanning recense pour chaque personne ce qu'elle fait chaque jour et contient 22500 enregistrements. En général, il y a un enregistrement par jour et par personne. Toutefois, une personne peut avoir plusieurs enregistrements le même jour. il est rare qu'une personne n'ait pas au moins un enregistrement sur un jour.
Mon objectif :
Trouver pour chaque enregistrement de la TPlanning, quel est le IdTypeContrat et le HoraireJ qui s'appliquent à la personne pour ce jour-là.
Voici le code de ma requête :
J'affiche les champs IdPlanning, IdPersonne, DateDeb, IdTypeContrat, HoraireJ pour lesquels la DateEffet est la plus grande dans la TContrats tout en étant inférieure (ou égale) à la DateDeb pour cet IdPersonne.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 SELECT TPlanning.IdPlanning, TPlanning.IdPersonne, TPlanning.DateDeb, TContrats.IdTypeContrat, TContrats.HoraireJ FROM (TZPersonnes INNER JOIN TContrats ON TZPersonnes.IdPersonne = TContrats.IdPersonne) INNER JOIN TPlanning ON TZPersonnes.IdPersonne = TPlanning.IdPersonne WHERE TContrats.DateEffet In (SELECT Max(TC1.DateEffet) AS MaxDeDateEffet FROM TContrats as TC1 WHERE TC1.DateEffet<=TPlanning.DateDeb GROUP BY TC1.IdPersonne HAVING TC1.IdPersonne=TPlanning.IdPersonne) ORDER BY TPlanning.DateDeb;
Mais je comprends bien que pour mes 22500 enregistrements, Access exécute cette sous-requête autant de fois. C'est d'autant plus long, qu'il s'agit d'une requête avec regroupement.
Quelle méthode je pourrais utiliser pour accélérer le traitement de cette requête ?
Je remercie d'avance ceux qui me répondront.
Bonne journée à chacun
Pierre Dumas
Partager