[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.
Configuration: Windows XP
Firefox 3.0

5 réponses

  1. Christounet Messages postés 1272 Date d'inscription   Statut Membre Dernière intervention   1 393
     
    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
    1. 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
  2. Christounet Messages postés 1272 Date d'inscription   Statut Membre Dernière intervention   1 393
     
    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
    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
  3. Christounet Messages postés 1272 Date d'inscription   Statut Membre Dernière intervention   1 393
     
    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
    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
  4. Christounet Messages postés 1272 Date d'inscription   Statut Membre Dernière intervention   1 393
     
    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
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Christounet Messages postés 1272 Date d'inscription   Statut Membre Dernière intervention   1 393
     
    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
    1. Laaris Messages postés 131 Statut Membre 73
       
      OK, merci beaucoup!
      0