IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Access Discussion :

Grave problème de performance access


Sujet :

Access

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2005
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 20
    Points : 12
    Points
    12
    Par défaut Grave problème de performance access
    J'ai une requête de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DELETE FROM Table
    WHERE IDCLIENT NOT IN (
      SELECT IDCLIENT
      FROM AutreTable
    )
    Table fait un peu plus de 10.000 enregistrements.
    AutreTable 1500.
    Les deux tables ne contiennnet pas d'idclient null (cf. astuce dans la faq access).

    Cette requête fonctionne parfaitement, manque de bol, elle est très longue (près de 5 minutes, un délai inacceptable dans mon appli).
    Si je fais la même requête en remplaçant le NOT IN par un IN, c'est instantané.
    Manque de bol, je ne peux pas tourner la requête (sachant que d'autres requêtes sont trop difficiles à tourner, ca sera immaintenable)

    Je soupsonne JET 4 d'être très très mal optimisé.

    J'ai essayé de tourner la requête différement, à savoir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DELETE Table.*
    FROM (Table
    INNER JOIN AutreTable ON Table.IDCLIENT = AutreTable)
    Mais ca ne marche pas sous access (arf)

    Est-ce que quelqu'un connaîtrait la solution pour que cela marche correctement (faire une requête rapide avec ce qui est désiré, quitte à la formuler différement) ?

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Bonjour,

    Il faut absolument créer un index dans chacune des tables pour le champ ID_CLIENT.

    Ensuite, tu peux essayer une requête SELECT avec une jointure externe entre les deux tables:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DELETE UneTable.* 
    FROM UneTable LEFT JOIN AutreTable 
        ON UneTable.ID_CLIENT = AutreTable.ID_CLIENT
    WHERE AutreTable.ID_CLIENT IS NULL;
    Bonne continuation,
    =JBO=

  3. #3
    Membre à l'essai
    Inscrit en
    Janvier 2005
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Merci pour la réponse ...

    mais en fait ca ne marche pas, ca me fait le même message d'erreur que dans le premier bout de SQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DELETE Table.*
    FROM (Table
    INNER JOIN AutreTable ON Table.IDCLIENT = AutreTable)
    (d'ailleurs je me rends compte que cette requête est fausse et que la tienne est juste)

    Le message est : "Impossible de supprimer dans les tables spécifiées".

    J'ai créée des index sur les deux tables, d'ailleurs elles ont été créées pour l'occasion.

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Au fait, j'y pense un peu tard , mais ce n'est pas du tout conseillé d'appeler une table avec le nom [Table].
    Ni un formulaire avec le nom [Form], ni .... (complètera qui voudra ).

    Parce que, l'exemple que je t'ai donné fonctionne chez moi... j'ai testé !!!

    Alors vite, renomme cette table et... miracle (j'espère !).

  5. #5
    Membre à l'essai
    Inscrit en
    Janvier 2005
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    bah oui, je ne te cache pas que c'était des noms bidons.
    j'ai recrée une base de test exemple, est-ce que tu aurais le temps de jeter un oeil ? histoire qu'on soit en phase

  6. #6
    Membre à l'essai
    Inscrit en
    Janvier 2005
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    j'ai access 2000, quelle version utilises-tu ?

  7. #7
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    J'ai Access 2000.
    Citation Envoyé par sohm
    j'ai recrée une base de test exemple, est-ce que tu aurais le temps de jeter un oeil ? histoire qu'on soit en phase
    D'accord .
    Que proposes-tu ?

  8. #8
    Membre à l'essai
    Inscrit en
    Janvier 2005
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    //

  9. #9
    Membre à l'essai
    Inscrit en
    Janvier 2005
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    tiens tiens, ca marche uniquement si Table2 (ou AutreTable) est en clef primaire, peux tu vérifier de ton côté si sur ta base de données de test c'est pareil ?

    Je vais vérifier sur la grosse base si le comportement est identique, et surtout si les performances sont correctes mais je suis confiant.

  10. #10
    Membre à l'essai
    Inscrit en
    Janvier 2005
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    bon je confirme sur la base réelle, ca marche et c'est à peu près instantané.
    Merci beaucoup de ton aide.

  11. #11
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Une bonne nouvelle, une mauvaise nouvelle...
    Par laquelle commencer ?

    Au niveau de l'interface utilisateur, l'exécution de la requête suppression "Requête1" affiche bien l'erreur "Impossible de supprimer dans les tables spécifiées" .

    En revanche, tu peux exécuter ce qui suit dans la fenêtre de déboggage de l'IDE VBA, et ça marche très bien .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CurrentDb.QueryDefs("Requête1").Execute
    As-tu essayé ?

    [Edit 23:12]
    Je viens de lire ton post de 22:58 et je te confirme que ta manip au niveau de la structure de la [Table2] fonctionne, à savoir déclarer que le champ [ID_CLIENT] est la clé primaire.
    Du coup, l'exécution de la requête à partir de l'interface utilisateur se déroule sans plus de Pb...
    Access 2000 est bien mystérieux en vérité...

    En-est-il de même pour XP et 2003 ?

  12. #12
    Membre à l'essai
    Inscrit en
    Janvier 2005
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Tiens tiens, je pensais que l'interface utilisateur était pareille à l'exécution du code par VBA.
    Ce qui m'intéresse perso, c'est l'exécution depuis .Net, ca peut donc marcher, je vais essayer.

  13. #13
    Membre à l'essai
    Inscrit en
    Janvier 2005
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    punaise ca fonctionne depuis .Net.
    Merci beaucoup !!!

  14. #14
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Ma réponse est dans le message précédent que j'ai édité.

    Sinon, concernant ta remarque...
    Citation Envoyé par sohm
    Tiens tiens, je pensais que l'interface utilisateur était pareille à l'exécution du code par VBA.
    La commande VBA équivalent à l'exécution de la requête via l'interface utilisateur serait plutôt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.OpenQuery "Requête1", acViewNormal
    A une prochaine fois .
    =JBO=

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] Problème performances Access.
    Par JPJOLY dans le forum IHM
    Réponses: 1
    Dernier message: 29/05/2013, 09h20
  2. Graves problèmes de performances (delai attente dépassé)
    Par franckgar dans le forum Développement
    Réponses: 33
    Dernier message: 27/01/2011, 23h10
  3. [AC-2000] Excel depuis Access : problème de performance
    Par niko8181 dans le forum VBA Access
    Réponses: 10
    Dernier message: 08/03/2010, 13h11
  4. Problème de TABLE ACCESS FULL
    Par elitost dans le forum Administration
    Réponses: 14
    Dernier message: 25/09/2004, 12h37
  5. [ POSTGRESQL ] Problème de performance
    Par Djouls64 dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 26/05/2003, 16h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo