Pregunta

El problema:

Usamos un programa escrito por nuestro mayor cliente para recibir pedidos, reservar transportes y hacer otras cosas relacionadas con el pedido. No tenemos otra oportunidad más que usar el programa y el cliente no nos da mucho apoyo cuando se trata de problemas con su programa. Solo tenemos que vivir con el programa.

La mayoría de las veces, este programa es extremadamente lento cuando se usa con dos o más usuarios, así que traté de mirar detrás de la cortina y encontrar la fuente del problema.

Algunos puntos sobre el programa que descubrí hasta ahora:

  • Está escrito en VB 6.0
  • Utiliza un Access-DB protegido por contraseña (Access 2000 MDB) que se encuentra en una carpeta en la máquina de un usuario.
  • Esa carpeta se comparte a través de la red y la usan todos los demás usuarios.
  • Utiliza la versión 4.00.9704 de msjet40.dll para comunicarse con el acceso. Supongo que es ADO?

También usé Monitor de proceso para monitorear el acceso a los archivos y encontré explica por qué el programa es tan lento: está realizando miles de operaciones de lectura en el archivo mdb, incluso cuando el programa está inactivo. A través de la red, esto es tremendamente lento:

Seguimiento del monitor de procesos http://img217.imageshack.us/img217/1456/ screenshothw5.png

La verdadera pregunta:

¿Hay alguna forma de monitorear las consultas que son responsables de la actividad de lectura? ¿Hay una marca de seguimiento que puedo establecer? ¿Enganchar la DLL de JET? Supongo que el programa está realizando algunas consultas costosas que hacen que JET lea muchos datos en el proceso.

PD: ya intenté colocar el mdb en el servidor de archivos de nuestra empresa con el éxito de que acceder a él fue incluso más lento que en el recurso compartido local. También intenté cambiar los mecanismos de bloqueo (bloqueo oportunista) en el cliente sin éxito.

Quiero saber qué sucede y necesito algunos datos concretos y sugerencias para que el desarrollador de nuestro cliente lo ayude a hacer que el programa sea más rápido.

¿Fue útil?

Solución

Para hacer que tus manos sucias aprendan exactamente lo que Access está haciendo entre bastidores, hay una función no documentada llamada JETSHOWPLAN: cuando se activa en el registro, se crea un archivo de texto showplan.out . Los detalles estan en este artículo de TechRepublic alternativo , resumido aquí:

  

La opción ShowPlan se agregó a Jet 3.0 y produce un archivo de texto   que contiene el plan de la consulta. (ShowPlan no admite subconsultas.)   Debe habilitarla agregando una clave de depuración en el registro de la siguiente manera:

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

Bajo la nueva clave de depuración, agregue un tipo de datos de cadena llamado JETSHOWPLAN   (debes usar todas las letras mayúsculas). Luego, agregue el valor clave ON a   habilitar la característica. Si Access se ha ejecutado en segundo plano,   debe cerrarlo y reiniciarlo para que la función funcione.

     

Cuando ShowPlan está habilitado, Jet crea un archivo de texto llamado SHOWPLAN.OUT   (que podría terminar en su carpeta Mis documentos o en la carpeta actual).   carpeta predeterminada, dependiendo de la versión de Jet que esté usando) cada   tiempo Jet compila una consulta. A continuación, puede ver este archivo de texto para pistas   cómo Jet está ejecutando sus consultas.

     

Recomendamos que deshabilite esta función cambiando el valor de la clave   a OFF a menos que lo estés utilizando específicamente. Jet anexa el plan para   un archivo existente y, finalmente, el proceso realmente ralentiza las cosas   abajo. Active la función solo cuando necesite revisar una específica   plan de consulta. Abra la base de datos, ejecute la consulta y luego deshabilite la   característica.

Para rastrear los problemas de pesadilla es inmejorable: es el tipo de cosa que obtienes en tus grandes y costosas bases de datos industriales. Esta característica es genial. Es encantadora y esponjosa. Es mi amigo & # 8230; ;-)

Otros consejos

¿No podría lanzar un rastreador de paquetes (como Wireshark) en la red y observar el tráfico entre un usuario y la máquina host?

Si usa una conexión ODBC, puedes habilitar el registro para eso.

  1. Inicie el Administrador de fuente de datos ODBC.
  2. Seleccione la pestaña Rastreo
  3. Seleccione el botón Iniciar rastreo ahora.
  4. Seleccione Aplicar o Aceptar.
  5. Ejecuta la aplicación por un tiempo.
  6. Regresar al Administrador de ODBC.
  7. Seleccione la pestaña Rastreo.
  8. Seleccione el botón Detener seguimiento ahora.
  9. La traza se puede ver en la ubicación que especificó inicialmente en el cuadro Ruta del archivo de registro.

Primera pregunta: ¿Tiene una copia de MS Access 2000 o superior?

Si es así: Cuando dice que el MDB está protegido por contraseña " ;, ¿quiere decir que cuando intenta abrirlo utilizando MS Access, recibe una solicitud de una contraseña solamente o le pide un nombre de usuario y una contraseña? (O bien, aparecerá un mensaje de error que dice: " No tiene los permisos necesarios para usar el objeto foo.mdb. & Quot ;?)

Si es lo último, (seguridad a nivel de usuario), busque un archivo .MDW correspondiente que vaya junto con el MDB. Si lo encuentra, este es el " archivo de información del grupo de trabajo " que se utiliza como " clave " para abrir el MDB. Intente crear un acceso directo de escritorio con un objetivo como:

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

MS Access debería solicitarle su nombre de usuario y contraseña, que (con suerte) es lo mismo que le pide la aplicación VB6. Esto le permitiría al menos abrir el archivo MDB y observar la estructura de la tabla para ver si hay fallas de diseño obvias.

Más allá de eso, por lo que sé, Eduardo está en lo cierto al decir que prácticamente necesitas poder ejecutar un depurador en el código fuente del desarrollador para descubrir exactamente qué hacen las consultas en tiempo real ...

No es posible sin la ayuda de los desarrolladores. Lo siento.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top