Journalisation des requêtes SQL Microsoft JET ou «Comment déboguer le programme de mon client?»

StackOverflow https://stackoverflow.com/questions/153053

Question

Le problème:

Nous utilisons un programme écrit par notre plus gros client pour recevoir des commandes, effectuer des transformations de livres et effectuer d'autres tâches liées aux commandes. Nous n’avons aucune autre chance que d’utiliser le programme et le client ne supporte pas beaucoup quand il s’agit de problèmes avec son programme. Nous devons juste vivre avec le programme.

Maintenant, ce programme est la plupart du temps extrêmement lent lorsqu'il est utilisé avec deux utilisateurs ou plus, aussi j'ai essayé de regarder derrière le rideau et de trouver la source du problème.

Quelques points concernant le programme que j'ai découvert jusqu'à présent:

  • C'est écrit en VB 6.0
  • Il utilise une base de données Access-DB (Access 2000 MDB) protégée par un mot de passe, située dans un dossier sur la machine d'un utilisateur.
  • Ce dossier est partagé sur le réseau et utilisé par tous les autres utilisateurs.
  • Il utilise la version 4.00.9704 de msjet40.dll pour communiquer avec accès. Je suppose que c'est ADO?

J'ai également utilisé Moniteur de processus pour contrôler l'accès aux fichiers et trouver pourquoi le programme est si lent: il effectue des milliers d’opérations de lecture sur le fichier mdb, même lorsque le programme est inactif. Ceci est bien sûr extrêmement lent sur le réseau:

Suivi du moniteur de processus http://img217.imageshack.us/img217/1456/ screenshothw5.png

La vraie question:

Existe-t-il un moyen de surveiller les requêtes responsables de l'activité de lecture? Existe-t-il un indicateur de trace que je peux définir? Accrocher les DLL JET? Je suppose que le programme effectue des requêtes coûteuses qui font que JET lit beaucoup de données au cours du processus.

PS: J’ai déjà essayé de placer la base de données mdb sur le serveur de fichiers de notre société, mais j’ai réussi à y accéder plus lentement que par le partage local. J'ai également essayé de changer les mécanismes de verrouillage (verrouillage opportuniste) sur le client sans succès.

Je veux savoir ce qui se passe et j'ai besoin de quelques faits concrets et de suggestions pour que le développeur de notre client l'aide à faire le programme plus rapidement.

Était-ce utile?

La solution

Pour vous permettre de comprendre exactement ce que Access fait en matière de requête, il existe une fonctionnalité non documentée appelée JETSHOWPLAN. Lorsqu'elle est activée dans le registre, elle crée un fichier texte showplan.out . Les détails sont en cet article de TechRepublic substitut , résumé ici:

  

L'option ShowPlan a été ajoutée à Jet 3.0 et génère un fichier texte.   qui contient le plan de la requête. (ShowPlan ne prend pas en charge les sous-requêtes.)   Vous devez l'activer en ajoutant une clé Debug au registre, comme suit:

\\HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\JET\4.0\Engines\Debug
     

Sous la nouvelle clé de débogage, ajoutez un type de données chaîne nommé JETSHOWPLAN .   (vous devez utiliser toutes les lettres majuscules). Ajoutez ensuite la valeur de clé ON à   activer la fonctionnalité. Si Access a été exécuté en arrière-plan, vous devez   doit le fermer et le relancer pour que la fonction fonctionne.

     

Lorsque ShowPlan est activé, Jet crée un fichier texte nommé SHOWPLAN.OUT .   (qui pourrait se retrouver dans votre dossier Mes documents ou le dossier   dossier par défaut, selon la version de Jet que vous utilisez) tous les   time Jet compile une requête. Vous pouvez ensuite afficher ce fichier texte pour trouver des indices.   à la façon dont Jet exécute vos requêtes.

     

Nous vous recommandons de désactiver cette fonctionnalité en modifiant la valeur de la clé    OFF sauf si vous l'utilisez spécifiquement. Jet ajoute le plan à   un fichier existant et finalement, le processus ralentit réellement les choses   vers le bas. Activez la fonctionnalité uniquement lorsque vous devez revoir un programme spécifique.   plan de requête. Ouvrez la base de données, exécutez la requête, puis désactivez le   fonctionnalité.

Pour traquer les problèmes cauchemardesques, c’est imbattable - c’est le genre de choses que vous retrouvez dans vos grosses bases de données industrielles coûteuses - cette fonctionnalité est cool - elle est belle et moelleuse - c’est mon ami…; -)

Autres conseils

Ne pouvez-vous pas lancer un renifleur de paquets (comme Wireshark) sur le réseau et surveiller le trafic entre un utilisateur et la machine hôte?

S'il utilise une connexion ODBC, vous pouvez activer la journalisation pour cela.

  1. Démarrer l'administrateur de sources de données ODBC.
  2. Sélectionnez l'onglet Traçage
  3. Sélectionnez le bouton Commencer le traçage maintenant.
  4. Sélectionnez Appliquer ou OK.
  5. Lancez l'application pendant un certain temps.
  6. Retournez à l'administrateur ODBC.
  7. Sélectionnez l'onglet Traçage.
  8. Sélectionnez le bouton Arrêter le traçage maintenant.
  9. La trace peut être affichée à l'emplacement que vous avez initialement défini dans la zone Chemin du fichier journal.

Première question: avez-vous une copie de MS Access 2000 ou une version supérieure?

Si oui: Lorsque vous dites que la MDB est "protégée par un mot de passe", voulez-vous dire que lorsque vous essayez de l'ouvrir à l'aide de MS Access, vous recevez une invite pour un mot de passe uniquement, ou vous invite-t-il à saisir un nom d'utilisateur et un mot de passe? (Vous pouvez également recevoir le message d'erreur suivant: "Vous ne disposez pas des autorisations nécessaires pour utiliser l'objet foo.mdb."?)

S'il s'agit de la dernière (sécurité au niveau de l'utilisateur), recherchez le fichier .MDW correspondant qui accompagne la MDB. Si vous le trouvez, il s'agit du " fichier d'informations sur le groupe de travail " qui est utilisé comme "clé" pour ouvrir le MDB. Essayez de créer un raccourci sur le bureau avec une cible telle que:

"Path to MSACCESS.EXE" "Path To foo.mdb" /wrkgrp "Path to foo.mdw"

MS Access devrait alors vous demander votre nom d'utilisateur et votre mot de passe, ce qui est (espérons-le) identique à ce que l'application VB6 vous demande. Cela vous permettrait au moins d’ouvrir le fichier MDB et de regarder la structure du tableau pour voir s’il existe des défauts de conception évidents.

Au-delà de cela, à ma connaissance, Eduardo a raison de dire qu'il est nécessaire de pouvoir exécuter un débogueur sur le code source du développeur pour savoir exactement ce que font les requêtes en temps réel ...

Cela n’est pas possible sans l’aide des développeurs. Désolé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top