[Access97] Temps d'exécution très long
Résolu
Laaris
Messages postés
131
Statut
Membre
-
Laaris Messages postés 131 Statut Membre -
Laaris Messages postés 131 Statut Membre -
Bonjour,
J'ai lancé cette requête il y a presqu'une heure et elle tourne toujours (et je crois qu'Access a planté ^^):
En gros j'ai deux tables contenant les références des cases d'une grille (A1, A2, A3 ...), et je compare ces références en les passant en hexadécimal, parce que Access n'est pas sensible à la casse (il confond donc les cases A1 et a1 par exemple).
Le fait que le temps d'exécution soit interminable est certainement dû à l'utilisation dans la requête d'une macro VBA (StrToHex). Y'a-t-il un moyen pour qu'elle s'exécute plus rapidement (et ne plante pas)?
Merci d'avance.
J'ai lancé cette requête il y a presqu'une heure et elle tourne toujours (et je crois qu'Access a planté ^^):
SELECT coord_mailles.MAPINFO_ID, Localisations_cases.case, Localisations_cases.N__Localisations FROM coord_mailles INNER JOIN Localisations_cases ON StrToHex(coord_mailles.Description)=StrToHex(Localisations_cases.case);
En gros j'ai deux tables contenant les références des cases d'une grille (A1, A2, A3 ...), et je compare ces références en les passant en hexadécimal, parce que Access n'est pas sensible à la casse (il confond donc les cases A1 et a1 par exemple).
Le fait que le temps d'exécution soit interminable est certainement dû à l'utilisation dans la requête d'une macro VBA (StrToHex). Y'a-t-il un moyen pour qu'elle s'exécute plus rapidement (et ne plante pas)?
Merci d'avance.
A voir également:
- [Access97] Temps d'exécution très long
- Pc long a demarrer - Guide
- Renommer plusieurs fichiers en même temps - Guide
- Family link le temps ne correspondent pas - Forum Contrôle parental
- Temps pour soi iphone - Guide
- Sablier snap temps - Forum Snapchat
5 réponses
Bonjour Laaris,
Tu peux créer une clé qui n'est pas une clé primaire sur une colonne sans la rendre unique lorsque tu es en mode "Design" (Access en anglais), j'ai mis ici une copie d'écran qui illustre cela (Indexed = Yes (duplicate) sur la colonne ville_origine)
A plus
Tu peux créer une clé qui n'est pas une clé primaire sur une colonne sans la rendre unique lorsque tu es en mode "Design" (Access en anglais), j'ai mis ici une copie d'écran qui illustre cela (Indexed = Yes (duplicate) sur la colonne ville_origine)
A plus
Laaris
Messages postés
131
Statut
Membre
73
J'ai mis les champs Description et case en "Indexé: oui (avec doublons)" et j'ai relancé la requête, mais c'est toujours aussi lent.
Bonjour Laaris,
Peux-tu me dire combien d'enregistrements tu as dans chaque table , et as-tu crée des clés sur chacune d'elle et si oui quelles sont-elles ?
A plus
Peux-tu me dire combien d'enregistrements tu as dans chaque table , et as-tu crée des clés sur chacune d'elle et si oui quelles sont-elles ?
A plus
Bonjour Laaris,
La première chose que je peux te proposer est de créer deux nouvelles clés, l'une sur la table coord_mailles sur la colonne description, l'autre sur la table localisations_cases sur la colonne case
L'inconvénient d'une nouvelle clé est que cela peut ralentir la mise-à-jour de la table mais devrait accélérer le temps de lecture surtout si tu fais un INNER JOIN sur cette clé.
Tiens moi au courant.
A plus
La première chose que je peux te proposer est de créer deux nouvelles clés, l'une sur la table coord_mailles sur la colonne description, l'autre sur la table localisations_cases sur la colonne case
L'inconvénient d'une nouvelle clé est que cela peut ralentir la mise-à-jour de la table mais devrait accélérer le temps de lecture surtout si tu fais un INNER JOIN sur cette clé.
Tiens moi au courant.
A plus
A l'origine je voulais que description et case soient les clés de mes tables, mais c'est impossible car ce sont ces champs qui contiennent les références des cases.
Access n'étant pas sensible à la case, il considérait que AA1 et aA1 (par exemple) étaient la même valeur, et refusait donc de faire de ce champ une clé primaire.
C'est pour ça que j'ai dû rajouter une clé qui numérote simplement chaque enregistrement de 1 à ...
Access n'étant pas sensible à la case, il considérait que AA1 et aA1 (par exemple) étaient la même valeur, et refusait donc de faire de ce champ une clé primaire.
C'est pour ça que j'ai dû rajouter une clé qui numérote simplement chaque enregistrement de 1 à ...
Bonjour Laaris,
Ok, je pense qu'Access n'utilise pas la nouvelle clé du fait de la fonction StrToHex, peux-tu essayer le code suivant tout en gardant les deux nouvelles clés
Tiens moi au courant.
A plus
Ok, je pense qu'Access n'utilise pas la nouvelle clé du fait de la fonction StrToHex, peux-tu essayer le code suivant tout en gardant les deux nouvelles clés
SELECT coord_mailles.MAPINFO_ID, Localisations_cases.case, Localisations_cases.N__Localisations FROM Localisations_cases , coord_mailles WHERE Localisations_cases.case = coord_mailles.Description AND StrToHex(Localisations_cases.case) = StrToHex(coord_mailles.Description);
Tiens moi au courant.
A plus
Effectivement c'est beaucoup plus rapide, mais je me suis rendu compte d'un problème avec StrToHex. En concaténant les valeurs hexadécimales de chaque caractère de la chaine, on peut créer une même valeur pour deux chaines différentes:
GJ510 et GZ510 passés en hexadécimal ont la même valeur, idem pour gJ510 et gZ510 et surement pour d'autres cas aussi. Je n'ai plus qu'à chercher une autre solution pour différencier majuscules et minuscules.
EDIT: mais non en fait, ta solution fonctionne, en comparant à la fois la valeur hexadécimale et la chaine de caractères, il ne peut pas y avoir d'erreur. Merci beaucoup!
Description StrToHex MAPINFO_ID GJ510 4700353130 142614 GZ510 4700353130 154518 gJ510 6700353130 761622 gZ510 6700353130 773526
GJ510 et GZ510 passés en hexadécimal ont la même valeur, idem pour gJ510 et gZ510 et surement pour d'autres cas aussi. Je n'ai plus qu'à chercher une autre solution pour différencier majuscules et minuscules.
EDIT: mais non en fait, ta solution fonctionne, en comparant à la fois la valeur hexadécimale et la chaine de caractères, il ne peut pas y avoir d'erreur. Merci beaucoup!
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bonjour Laaris,
Concernant on peut créer une même valeur pour deux chaines différentes tu trouveras le code suivant qui éviteras ce problème
J'ai enlevé l'instruction format dans le module.
A plus
Concernant on peut créer une même valeur pour deux chaines différentes tu trouveras le code suivant qui éviteras ce problème
Function StrToHex(S As Variant) As Variant
Dim Temp As String, I As Integer
If VarType(S) <> 8 Then
StrToHex = S
Else
Temp = ""
For I = 1 To Len(S)
Temp = Temp & Hex(Asc(Mid(S, I, 1)))
Next I
StrToHex = Temp
End If
End Function
J'ai enlevé l'instruction format dans le module.
A plus