Registrazione query SQL Microsoft JET o "Come posso eseguire il debug del programma del mio cliente?"

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

Domanda

Il problema:

Usiamo un programma scritto dal nostro più grande cliente per ricevere ordini, prenotare trasporti e fare altre cose relative agli ordini. Non abbiamo altra possibilità se non quella di utilizzare il programma e il cliente non è di grande aiuto quando si tratta di problemi con il suo programma. Non ci resta che convivere con il programma.

Ora questo programma è estremamente lento quando lo si utilizza con due o più utenti, quindi ho cercato di guardare dietro il sipario e trovare l'origine del problema.

Alcuni punti sul programma che ho scoperto finora:

  • È scritto in VB 6.0
  • Utilizza un Access-DB protetto da password (Access 2000 MDB) che si trova in una cartella sul computer di un utente.
  • Quella cartella è condivisa sulla rete e utilizzata da tutti gli altri utenti.
  • Utilizza la versione 4.00.9704 di msjet40.dll per comunicare con l'accesso. Immagino sia ADO?

Ho anche usato Process Monitor per monitorare l'accesso ai file e trovato capire perché il programma è così lento: sta facendo migliaia di operazioni di lettura sul file mdb, anche quando il programma è inattivo. Sulla rete questo è ovviamente tremendamente lento:

Traccia di Process Monitor http://img217.imageshack.us/img217/1456/ screenshothw5.png

La vera domanda:

Esiste un modo per monitorare le query responsabili dell'attività di lettura? C'è un flag di traccia che posso impostare? Collegando le DLL JET? Immagino che il programma stia facendo delle query costose che stanno causando a JET la lettura di molti dati nel processo.

PS: ho già provato a mettere l'mdb sul file server della nostra azienda con successo che accedervi è stato anche più lento rispetto alla condivisione locale. Ho anche provato a modificare i meccanismi di blocco (blocco opportunistico) sul client senza successo.

Voglio sapere cosa sta succedendo e ho bisogno di alcuni fatti concreti e suggerimenti per lo sviluppatore dei nostri clienti per aiutarlo a rendere il programma più veloce.

È stato utile?

Soluzione

Per mettere le mani sporche esattamente su ciò che Access sta facendo in termini di query dietro le quinte c'è una funzione non documentata chiamata JETSHOWPLAN - quando accesa nel registro crea un file di testo showplan.out . I dettagli sono in questo articolo di TechRepublic alternate , riassunto qui:

  

L'opzione ShowPlan è stata aggiunta a Jet 3.0 e produce un file di testo   che contiene il piano della query. (ShowPlan non supporta le subquery.)   È necessario abilitarlo aggiungendo una chiave di debug al registro in questo modo:

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

Nella nuova chiave Debug, aggiungi un tipo di dati stringa denominato JETSHOWPLAN   (devi usare tutte le lettere maiuscole). Quindi, aggiungi il valore chiave ON a   abilita la funzione. Se Access è stato eseguito in background, tu   deve chiuderlo e riavviarlo affinché la funzione funzioni.

     

Quando ShowPlan è abilitato, Jet crea un file di testo chiamato SHOWPLAN.OUT   (che potrebbe finire nella cartella Documenti o nella cartella corrente   cartella predefinita, a seconda della versione di Jet in uso) ogni   time Jet compila una query. È quindi possibile visualizzare questo file di testo per indizi   a come Jet esegue le tue query.

     

Ti consigliamo di disabilitare questa funzione modificando il valore della chiave   su OFF a meno che tu non lo stia utilizzando specificamente. Jet accoda il piano a   un file esistente e, alla fine, il processo effettivamente rallenta le cose   giù. Attiva la funzione solo quando è necessario rivedere uno specifico   piano di query. Aprire il database, eseguire la query e quindi disabilitare il   caratteristica.

Per rintracciare i problemi dell'incubo è imbattibile - è il genere di cose che ottieni sui tuoi costosi database industriali costosi - questa funzionalità è interessante - è adorabile e soffice - è mio amico ... ;-)

Altri suggerimenti

Non potresti lanciare uno sniffer di pacchetti (come Wireshark) sulla rete e guardare il traffico tra un utente e la macchina host?

Se utilizza una connessione ODBC è possibile abilitare la registrazione per questo.

  1. Avvia Amministratore origine dati ODBC.
  2. Seleziona la scheda Traccia
  3. Seleziona il pulsante Avvia traccia ora.
  4. Seleziona Applica o OK.
  5. Esegui l'app per un po '.
  6. Torna all'amministratore ODBC.
  7. Seleziona la scheda Traccia.
  8. Seleziona il pulsante Interrompi traccia ora.
  9. La traccia può essere visualizzata nella posizione inizialmente specificata nella casella Percorso file di registro.

Prima domanda: hai una copia di MS Access 2000 o migliore?

In tal caso: Quando dici che l'MDB è "protetto da password", vuoi dire che quando provi ad aprirlo usando MS Access ricevi una richiesta solo per una password o ti richiede un nome utente e una password? (O ti dà un messaggio di errore che dice, " Non hai i permessi necessari per usare l'oggetto foo.mdb. & Quot ;?)

Se si tratta di quest'ultimo, (sicurezza a livello di utente), cercare un file .MDW corrispondente associato all'MDB. Se lo trovi, questo è il "file di informazioni sul gruppo di lavoro" che viene utilizzato come chiave " chiave " per l'apertura dell'MDB. Prova a creare un collegamento sul desktop con un obiettivo come:

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

MS Access dovrebbe quindi richiedere il nome utente e la password che sono (si spera) uguali a quelli richiesti dall'app VB6. Ciò consentirebbe almeno di aprire il file MDB e guardare la struttura della tabella per vedere se ci sono evidenti difetti di progettazione.

Oltre a ciò, per quanto ne so, Eduardo ha ragione sul fatto che devi praticamente essere in grado di eseguire un debugger sul codice sorgente dello sviluppatore per scoprire esattamente cosa stanno facendo le query in tempo reale ...

Non è possibile senza l'aiuto degli sviluppatori. Siamo spiacenti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top