[Access97] Temps d'exécution très long

Résolu
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é ^^):

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.

5 réponses

Christounet Messages postés 1266 Statut Membre 1 392
 
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
2
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.
0
Christounet Messages postés 1266 Statut Membre 1 392
 
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
1
Laaris Messages postés 131 Statut Membre 73
 
Salut Christounet (désolé c'est encore toi qui va te coltiner mon problème^^)

Donc la table coord_mailles a 793848 enregistrement et sa clé est MAPINFO_ID, la table localisations_cases a 6463 enregistrements, sa clé s'appelle CONTAINS_ID.
0
Christounet Messages postés 1266 Statut Membre 1 392
 
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
1
Laaris Messages postés 131 Statut Membre 73
 
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 à ...
0
Christounet Messages postés 1266 Statut Membre 1 392
 
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
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
1
Laaris Messages postés 131 Statut Membre 73
 
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:

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!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Christounet Messages postés 1266 Statut Membre 1 392
 
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
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
1
Laaris Messages postés 131 Statut Membre 73
 
OK, merci beaucoup!
0