Microsoft JET SQL Query Logging ou “Como faço para depurar o programa do meu cliente?”

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

Pergunta

O problema:

Nós usamos um programa escrito pelo nosso maior cliente para receber ordens, Tranports livro e fazer outras coisas relacionadas a pedidos. Não temos outra chance, mas para usar o programa e o cliente é muito unsupportive quando se trata de problemas com seu programa. Nós apenas temos que viver com o programa.

Agora, este programa é na maioria das vezes extremamente lento quando usá-lo com dois ou mais usuários, então eu tentei olhar por trás da cortina e encontrar a origem do problema.

Alguns pontos sobre o programa que eu descobri até agora:

  • Está escrito em VB 6.0
  • Ele usa um protegido por senha Access-DB (Access 2000 MDB) que está localizada uma pasta no computador de um usuário.
  • Essa pasta é compartilhada através da rede e utilizado por todos os outros usuários.
  • Ele usa o msjet40.dll versão 4.00.9704 para se comunicar com o acesso. Eu acho que é ADO?

Eu também usei Monitor de Processo para acesso a arquivos do monitor e encontrou por que o programa é tão lento: ele está fazendo milhares de operações de leitura no arquivo mdb, mesmo quando o programa está ocioso. Através da rede este é, naturalmente, extremamente lento:

Process Monitor Traço http://img217.imageshack.us/img217/1456/ screenshothw5.png

A verdadeira pergunta:

Existe alguma maneira de monitorar as consultas que são responsáveis ??pela atividade de leitura? Existe um sinalizador de rastreamento posso definir? Conectando o JET DLL? Eu acho que o programa está fazendo algumas consultas caras que estão causando JET para ler grandes quantidades de dados no processo.

PS: Eu já tentei colocar o MDB no servidor de arquivos da nossa empresa com o sucesso que o acesso era ainda mais lento do que sobre o compartilhamento local. Eu também tentei mudar os mecanismos de bloqueio (bloqueio oportunista) no cliente sem sucesso.

Eu quero saber o que está acontecendo e precisa de alguns fatos e sugestões para desenvolvedor do nosso cliente para ajudá-lo / la a fazer o Programa mais rápido.

Foi útil?

Solução

Para começar suas mãos sujas sobre o que exatamente Acesso está fazendo consulta-wise nos bastidores há um recurso não documentado chamado JETSHOWPLAN - quando ligado no Registro ele cria um arquivo de texto showplan.out. Os detalhes estão em este artigo TechRepublic alternativo , resumidas aqui:

A opção ShowPlan foi adicionado ao Jet 3.0, e produz um arquivo de texto que contém o plano da consulta. (ShowPlan não suporta subconsultas.) Você deve habilitá-lo adicionando uma chave de depuração para o registro da seguinte forma:

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

De acordo com a nova chave Debug, adicionar um JETSHOWPLAN tipo de dados de cadeia denominado (Você deve usar todas as letras maiúsculas). Em seguida, adicione o ON chave valor para ativar o recurso. Se o Access foi executado em segundo plano, você deve fechá-lo e relançá-lo para a função de trabalho.

Quando ShowPlan está habilitado, Jet cria um arquivo de texto chamado SHOWPLAN.OUT (Que pode acabar na sua pasta My Documents ou a corrente pasta padrão, dependendo da versão do Jet você está usando) cada tempo Jet compila uma consulta. Você pode então ver este arquivo de texto em busca de pistas a como Jet está a executar suas consultas.

É recomendável que você desativar esse recurso, alterando o valor da chave para OFF a menos que você estiver usando-lo especificamente. Jet acrescenta o plano para um arquivo existente e, eventualmente, o processo realmente atrasa as coisas baixa. Ativar o recurso somente quando você precisa para rever um específico plano de consulta. Abra o banco de dados, executar a consulta e, em seguida, desativar o recurso.

Para rastrear problemas de pesadelo é imbatível - é o tipo de coisa que você tem em suas grandes bases de dados industriais caros - este recurso é legal - é lindo e fofo - é meu amigo ...; -)

Outras dicas

Você não poderia jogar um packet sniffer (como Wireshark) na rede e ver o tráfego entre um usuário ea máquina host?

Se ele usa uma conexão ODBC pode activar o registo para isso.

  1. Inicie dados ODBC Fonte administrador.
  2. Selecione a guia Rastreamento
  3. Selecione o botão Iniciar rastreamento agora.
  4. Selecionar Aplicar ou OK.
  5. Execute o aplicativo por algum tempo.
  6. Voltar à ODBC Administrator.
  7. Selecione a guia Rastreamento.
  8. Selecione o botão Parar rastreamento agora.
  9. O traço pode ser visto no local que você inicialmente especificado na caixa Caminho do arquivo do Log.

Primeira pergunta: Do que você tem uma cópia do MS Access 2000 ou melhor

?

Se assim for: Quando você diz que o MDB está "protegido por senha", que quer dizer que, quando você tentar abri-lo usando o MS Access você receber um prompt para apenas uma senha, ou ele pedir-lhe um nome de usuário e senha? (Ou dar-lhe uma mensagem de erro que diz: "Você não tem as permissões necessárias para usar o objeto foo.mdb."?)

Se ele é o último, (segurança em nível de usuário), procure um ficheiro.mdw correspondente que vai junto com o MDB. Se você encontrá-lo, este é o "grupo de trabalho arquivo de informações" que é usado como uma "chave" para abrir o MDB. Tente fazer um atalho no desktop com um alvo como:

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

MS Access deve então pedir-lhe para o seu nome de usuário e senha que é (espero) o mesmo que o aplicativo VB6 lhe pede. Isso, pelo menos, permitir que você abra o arquivo MDB e olhar para a estrutura da tabela para ver se existem falhas de projeto óbvias.

Além disso, tanto quanto eu sei, Eduardo é correto que você praticamente necessidade de ser capaz de executar um depurador de código fonte do desenvolvedor para descobrir exatamente o que as consultas em tempo real estão fazendo ...

Não é possível sem a ajuda dos desenvolvedores. Desculpe.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top