Les Allergies
Alimentaires
Posez votre question Signaler

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

Laaris 134Messages postés 1 avril 2008Date d'inscription 17 juin 2011Dernière intervention - Dernière réponse le 4 juil. 2008 à 14:22
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.
Lire la suite 

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

10 réponses
Réponse
+1
moins plus
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
Laaris- 3 juil. 2008 à 11:27
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.
Ajouter un commentaire
Réponse
+1
moins 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
Laaris- 3 juil. 2008 à 11:46
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 à ...
Ajouter un commentaire
Réponse
+1
moins plus
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
Laaris- 3 juil. 2008 à 13:20
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.
Ajouter un commentaire
Réponse
+1
moins plus
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
Laaris- 3 juil. 2008 à 16:20
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!
Ajouter un commentaire
Réponse
+1
moins plus
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
Laaris- 4 juil. 2008 à 14:22
OK, merci beaucoup!
Ajouter un commentaire
Ce document intitulé « [Access97] Temps d'exécution très long » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?