sql >> Base de Datos >  >> RDS >> Access

JetShowPlan:una introducción

Escribí brevemente sobre JetShowPlan en mi artículo sobre Ajuste del rendimiento de consultas de acceso. Como escribí en ese artículo, SQL es un lenguaje declarativo. Cuando escribe una consulta, le está diciendo al motor de la base de datos qué usted quiere. El motor de la base de datos decide cómo mejor para lograr eso para usted. En general, esto es bueno, porque optimizar las operaciones basadas en conjuntos es difícil y dejar que el motor de la base de datos lo haga por usted le permite aprovechar el conocimiento de aquellos que dedican sus vidas a ese problema específico.

La desventaja es que el cómo se convierte en una caja negra. Introduce algo de SQL en la caja negra y sale un conjunto de resultados con un montón de datos. El motor de la base de datos es extremadamente confiable para proporcionarle exactamente los datos que solicitó. El problema es que el rendimiento de la recuperación de datos puede estar por todas partes. Para ser claros, el bajo rendimiento casi nunca es culpa del motor de la base de datos. Por lo general, el problema es que nos falta un índice o filtramos el resultado de una función de VBA o nos unimos en dos tablas vinculadas que se almacenan en ubicaciones físicamente separadas.

Cuando surge este problema, necesitamos una forma de solucionarlo. Introduzca JetShowPlan. Piense en esto como un destornillador especial que nos permite desmontar la caja negra y mirar dentro para ver cómo el motor de la base de datos está implementando los comandos SQL que le damos. Con este conocimiento, podemos modificar el SQL, agregar un índice o, de lo contrario, abordar el origen de nuestro cuello de botella en el rendimiento.

Comencemos.

Clave de registro

JetShowPlan funciona escribiendo el plan de consulta (es decir, el contenido del cuadro negro) en un archivo de texto cada vez que el motor de base de datos ACE/Jet ejecuta any consulta. Este archivo de texto se llena rápido. La creación del archivo de texto requiere recursos que reducen aún más el rendimiento de las consultas. Por lo tanto, solo queremos habilitar esta función cuando estamos solucionando un problema activamente.

Como esta es una herramienta para usuarios avanzados, no hay ninguna configuración en la interfaz de usuario de Access para habilitar este modo. La única forma de activarlo o desactivarlo es estableciendo un valor en el registro. El valor del registro se ajusta al siguiente patrón (el texto entre llaves sirve como marcador de posición):

[HKEY_LOCAL_MACHINE\SOFTWARE{\Wow6432Node}\Microsoft\Office\{xx}.0\Access Connectivity Engine\Engines\Debug]
"JETSHOWPLAN"="ON"

Consideraciones de versión y bitness

El patrón de valor de registro que mostré anteriormente usa algún texto de marcador de posición para dar cuenta de las diferencias entre los entornos de Access. El texto del número de versión \{xx}.0\ debe reemplazarse con el número de versión que corresponde a la versión de Access instalada en su máquina:

  • 12.0 :Acceso 2007
  • 13.0 :omitido para evitar desencadenar triskaidekaphobes
  • 14.0 :Acceso 2010
  • 15.0 :Acceso 2013
  • 16.0 :Acceso 2016 y 2019

El \Wow6432Node ("Wow" significa "Windows de 32 bits en Windows de 64 bits") solo se requiere si está ejecutando una versión de 32 bits de Microsoft Access en una versión de 64 bits de Windows. Si Access y Windows son de 32 bits o de 64 bits, entonces esa "carpeta" (o "clave" en la jerga del registro) no es necesaria.

En formato VBA:

    If Is32BitAccess Xor Is32BitWindows Then
        IncludeWow6432Key = True
    Else
        IncludeWow6432Key = False
    End If

Por ejemplo, una instalación de 32 bits de Access 2010 que se ejecuta en Windows de 64 bits requeriría la siguiente entrada de registro:

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\14.0\Access Connectivity Engine\Engines\Debug]
"JETSHOWPLAN"="ON"

Del mismo modo, una instalación de 64 bits de Access 2019 en Windows de 64 bits requeriría:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\16.0\Access Connectivity Engine\Engines\Debug]
"JETSHOWPLAN"="ON"

También debo tener en cuenta que la primera vez que cree esta entrada, es probable que deba agregar la clave (carpeta) "Depurar" y el nombre y los datos del valor JETSHOWPLAN.

Estos son los pasos para hacerlo:

  1. Ejecutar regedit como administrador
  2. Navegue a la tecla "\Engines" siguiendo las notas anteriores
  3. Haga clic con el botón derecho en "\Engines" y seleccione Nuevo -> Clave
  4. Cambie el nombre de la clave de "Nueva clave n.º 1" a "Depuración"

Luego, deberá agregar el valor de cadena "JETSHOWPLAN" con los datos "ON " para habilitar la adición a showplan.out archivo o "DESACTIVADO " para dejar de agregar al archivo.

  1. Haga clic derecho en la tecla "\Depurar" y seleccione Nuevo -> Valor de cadena
  2. Cambie el nombre del valor de "Nuevo valor n.º 1" a "JETSHOWPLAN"
  3. Haga clic con el botón derecho en el nombre del valor "JETSHOWPLAN" y elija Modificar...
  4. Establecer los datos del valor en ON luego haga clic en el botón [OK]

La próxima vez que inicie una nueva instancia de Access, comenzará a agregar datos al archivo Showplan.out. Cualquier instancia de Access que ya se esté ejecutando cuando realice los cambios anteriores no se verá afectada. Lo mismo ocurre cuando desactiva la configuración OFF . Los cambios no surtirán efecto hasta que inicie un nuevo msaccess.exe instancia. No es necesario cerrar las instancias existentes de Access; es posible tener una instancia abierta de Access que esté escribiendo activamente en showplan.out mientras que una instancia diferente de Access no lo esté.

Script de teclas automáticas

No voy a mentir; saltando a regedit cada vez que quiero encender o apagar JetShowPlan es molesto. Si tuviera que hacer eso, apenas me molestaría. ¡Pero no tengo que hacer eso! Creé una tecla de acceso directo en Autohotkey que activa y desactiva JetShowPlan.

^#q:: ; Ctl + Win + Q  (feel free to use your own key combination)
    ;--== Toggle JETSHOWPLAN ==--
    
    ;----- BEGIN CONFIGURATION (make all changes here) -------------
    ShowPlanRegView = 64   ; set to 32 for 32-bit Access
    ShowPlanKey = SOFTWARE\Microsoft\Office\16.0\Access Connectivity Engine\Engines\Debug  ; change 16.0 to match Access version
    ;----- END CONFIGURATION ---------------------------------------
    
    SetRegView %ShowPlanRegView%
    RegRead ShowPlanSetting, HKEY_LOCAL_MACHINE\%ShowPlanKey%, JETSHOWPLAN
    If ( ShowPlanSetting = "OFF" ) {
            RegWrite REG_SZ, HKEY_LOCAL_MACHINE\%ShowPlanKey%, JETSHOWPLAN, ON
            If ErrorLevel
                MsgBox Error enabling JetShowPlan. Check permissions on:`n`nHKLM\%ShowPlanKey%`n`nfor user '%A_UserName%'
            Else
                MsgBox JetShowPlan set to ON
    } Else {
            RegWrite REG_SZ, HKEY_LOCAL_MACHINE\%ShowPlanKey%, JETSHOWPLAN, OFF
            If ErrorLevel
                MsgBox Error disabling JetShowPlan. Check permissions on:`n`nHKLM\%ShowPlanKey%`n`nfor user '%A_UserName%'
            Else
                MsgBox JetShowPlan set to OFF
    }
    SetRegView Default
    Return

Ahora, cuando quiero ajustar mis consultas, presiono [Ctl] + [Win] + [Q] y veo un cuadro de mensaje que dice "JetShowPlan establecido en ON". Cuando termino, cierro Access, presiono [Ctl] + [Win] + [Q] y veo "JetShowPlan desactivado".

Permisos de ajuste

Tengo dos cuentas de usuario de Windows diferentes:una con permisos estándar que uso para el trabajo diario y otra con permisos de administrador para instalar software, etc. Esta es una práctica recomendada de seguridad común.

El problema es que la clave de registro de JetShowPlan está en la sección HKLM. De forma predeterminada, solo los administradores pueden realizar cambios en los valores de ese subárbol. Esto es molesto porque cuando trato de ejecutar mi secuencia de comandos Autohotkey aparece el siguiente mensaje de error:

Sin embargo, no te preocupes. Como sugiere el mensaje anterior, podemos arreglar esto. La mejor parte es que podemos hacerlo conveniente sin reducir nuestra postura de seguridad. Aquí está el truco.

  1. Abrir regedit como administrador
  2. Navegue a \Debug clave
  3. Haga clic derecho en \Debug y seleccione Permisos...
  4. Haga clic en el botón [Agregar...]
  5. Ingrese el nombre de usuario del cuadro de mensaje de arriba ('Mike'), haga clic en [Comprobar nombres], luego haga clic en [Aceptar]
  6. Permitir [√] "Control total" para el usuario
  7. Haga clic en [Aceptar] para guardar los cambios

Ahora, cuando presiono [Ctl] + [Win] + [Q], se activa y desactiva JetShowPlan y se actualiza el registro automáticamente.

Encontrar Showplan.out

Access no le avisará dónde el motor de base de datos Jet/ACE está agregando información del plan de consulta cuando JetShowPlan está habilitado. He pasado más tiempo del que me gustaría admitir buscando una copia falsa de showplan.out . Esta sección te salvará de compartir ese destino.

Ubicación predeterminada

El primer lugar para buscar es en la carpeta Documentos del usuario actual. Por ejemplo, mi nombre de usuario de Windows es "Mike", por lo que el primer lugar donde esperaría encontrar el archivo es:C:\Users\Mike\Documents\showplan.out .

Usando CurDir()

Técnicamente hablando, el showplan.out El archivo se crea en el directorio de trabajo actual. Esa suele ser la carpeta Documentos del usuario actual, pero no siempre. La forma infalible de encontrar la ubicación del archivo es usar CurDir() función.

Puede copiar, pegar y ejecutar la siguiente línea de código en la ventana inmediata del IDE de VBA para abrir el archivo showplan.out (suponiendo que haya habilitado JetShowPlan en el registro):

Shell "notepad """ & CurDir & "\showplan.out""", vbNormalFocus

Cambiar la ubicación de salida a través de ChDir()

Si por alguna razón desea especificar una ubicación diferente para el showplan.out archivo, puede hacerlo usando la función ChDir(). Esa función cambia el directorio de trabajo actual. Y, como mencioné anteriormente, el directorio actual es donde se encuentra el showplan.out reside el archivo. Tan pronto como cambie el directorio de trabajo actual, JetShowPlan comienza a escribir en la nueva carpeta; no es necesario cerrar y volver a abrir Access.

¿Por qué querrías hacer esto? Supongamos que desea comparar tres enfoques diferentes para recuperar los mismos datos. Escribe tres consultas diferentes para ver cómo los cambios que realiza afectan el plan de consulta. Desde showplan.out es tan detallado que sería bueno tener cada plan de consulta en su propio archivo. Esto hará que los planes de consulta sean más fáciles de comparar. Así es como podría hacer eso. El primer paso es asegurarse de que cada una de estas carpetas exista. Luego, ejecute las siguientes líneas de código:

ChDir "C:\Users\Mike\Documents\Showplan\A"
DoCmd.OpenQuery "CollectTax1"
ChDir "C:\Users\Mike\Documents\Showplan\B"
DoCmd.OpenQuery "CollectTax2"
ChDir "C:\Users\Mike\Documents\Showplan\C"
DoCmd.OpenQuery "CollectTax3"
ChDir "C:\Users\Mike\Documents"

Usa todo lo que tienes (o descárgalo si no lo tienes) aún no lo tengo)

Mientras que CurDir() le dará una ubicación definitiva para los cambios más recientes en showplan.out archivo, no puede decirle cuáles eran los directorios de trabajo anteriores. Y, si ha cerrado la instancia de Access que creó el showplan.out archivo, no hay garantía de que la próxima instancia de Access que abra tenga el mismo directorio actual.

Recientemente me encontré con una pequeña utilidad útil llamada "Todo". Es un pequeño ejecutable que indexa todo su disco duro en solo unos segundos. Una vez que se completa la indexación, puede buscar instantáneamente archivos o carpetas en cualquier lugar de su disco.

Puedes descargar Todo desde aquí o vía Chocolatey:choco install everything . Abrir Todo , busque showplan.out , y en menos de un segundo verá todas las instancias de showplan.out en su computadora junto con la última fecha de modificación. Ojalá hubiera tenido esta herramienta hace años.

Dar sentido a Showplan.out

La primera vez que abre un showplan.out archivo, espere ser desconcertado. Hay mucho texto y gran parte es ruido. Aquí hay un extracto de un archivo generado cuando abrí la base de datos de muestra de Northwind:

Las consultas que comienzan con una tilde (~ ) representan SQL sin procesar que se guarda en la hoja de propiedades de un formulario o informe y no se guarda como un objeto QueryDef permanente. Los principales puntos de interés son los pasos numerados para cada consulta:01) , 02) , 03) , etc.  Quieres seguir estos pasos para buscar buenas y malas señales que puedan sugerir dónde hay problemas.

Que yo sepa, no existe documentación oficial sobre el formato y el contenido de showplan.out expediente. Eso está bien, sin embargo, porque no vamos a quedar atrapados en las minucias. Nuestro objetivo principal es identificar problemas evidentes y abordarlos. Aquí se aplica la regla del 80/20. La mayor parte de las ganancias de rendimiento provendrán de uno o dos ajustes simples a nuestras consultas.

Buenas señales

Esto es todo acerca de los índices. Queremos que el plan de consulta use índices, especialmente en los pasos iniciales de una consulta de varios pasos. Dos palabras clave diferentes indican que se están utilizando índices:index y rushmore . Rushmore es el nombre en clave de la tecnología de optimización de consultas desarrollada originalmente por Fox Software a principios de la década de 1980. Microsoft compró la empresa en 1992 e incorporó la tecnología al motor de base de datos Jet.

Las consultas que utilizan la tecnología Rushmore para procesar índices se ejecutan más rápido que las que utilizan índices de forma más tradicional. La tecnología Rushmore solo se puede utilizar con tablas de Access (tanto locales como vinculadas), junto con tablas FoxPro y dBASE vinculadas. En particular, Rushmore no se puede usar con tablas de SQL Server vinculadas. Para aumentar el rendimiento de las tablas de SQL Server vinculadas, a menudo es mejor escribir consultas de transferencia, pero eso va más allá del alcance de este artículo.

Malas señales

Hay algunas malas señales a tener en cuenta en el showplan.out expediente. La simple presencia de estos signos no significa necesariamente que haya un problema. Dicho esto, si está solucionando problemas de una consulta con bajo rendimiento, puede pensar en estas palabras como indicadores de advertencia de posibles problemas:X-Prod , scanning , temp , temporary .

El X-Prod La palabra clave aparece cuando tiene una consulta con una combinación cartesiana (también conocida como combinación cruzada o producto cruzado). Esto suele suceder por error cuando olvida unir dos tablas en el editor de consulta por ejemplo (QBE). El resultado es que cada registro de la tabla 1 se compara con cada registro de la tabla 2. El número total de registros es el producto de los dos recuentos de la tabla. Entonces, si la tabla 1 tiene 7 registros y la tabla 2 tiene 9 registros, la combinación cruzada de las dos tablas arroja 63 registros. Puede imaginar el problema si ambas tablas tienen miles de registros o más.

01) Inner Join table 'Table1' to table 'Table2'
      using X-Prod join

La siguiente palabra clave a tener en cuenta es escaneo . Si el motor de la base de datos no puede utilizar un índice para filtrar los resultados, recurre al análisis. Esto significa que tiene que examinar cada fila individualmente para ver si cumple con los criterios de consulta. Cuando vea esta palabra en un showplan.out archivo, a menudo significa que necesita agregar un índice a la columna que se escanea. ¡Pero no siempre! Para columnas con baja cardinalidad (solo unos pocos valores únicos, como una columna de estado), generalmente hay pocas ventajas en agregar un índice. Una vez agregado, el índice debe mantenerse. Esto ralentiza las inserciones y ocupa espacio en disco. Además, si el rendimiento de la consulta es aceptable en los datos de producción, agregar un índice a la columna escaneada es una optimización prematura (que debe evitar).

Finalmente, están los temp y temporal palabras clave Estos indican que el motor de la base de datos ha tenido que realizar algún tipo de operación de forma temporal. Cuando creamos y guardamos una definición de consulta, ese objeto se guarda con ciertos metadatos para optimizar la ejecución repetida. Obviamente, dichos metadatos se pierden cuando los índices temporales o las uniones quedan fuera del alcance. Por lo general, estas palabras clave se pueden ignorar, pero pueden indicarle la dirección correcta si se queda perplejo con una consulta de bajo rendimiento sin otras fallas más obvias.

Para recapitular en términos demasiado simplificados:

      BUENO  >  >  >  >  >  MAL:
Rushmore> índices> temporal/temporal> escaneo> X-Prod

Idioma personalizado de Notepad++

Si ha estado leyendo mis otros trabajos, sabe que tengo fuertes sentimientos sobre el aumento de la relación señal/ruido en la programación (y en la vida en general). Con este fin, creé un archivo de "idioma definido por el usuario" en Notepad ++ para agregar resaltado de sintaxis a showplan.out archivos Ahora, cuando abro showplan.out archivos, se ven como la captura de pantalla a continuación. Las palabras clave "BUENAS" se colorean en texto azul y las palabras clave "MALAS" se colorean en texto rojo. Este es un ejemplo de hacer que un código incorrecto parezca incorrecto.

Para configurar esto, sigue estos pasos:

  1. Abrir el Bloc de notas++
  2. Idioma -> Idioma definido por el usuario -> Defina su idioma...
  3. Haga clic en [Crear nuevo...]
  4. Ingrese el nombre:showplan.out
  5. Haga clic en [Aceptar]
  6. Ir a _| Carpeta y Predeterminado|_ pestaña
  7. Debajo de "Doblar en estilo de código 2", ingrese Inputs para abrir y End inputs para Cerrar
  8. Ir a la pestaña _|Lista de palabras clave|_
  9. Haga clic en [Styler] debajo del primer grupo y establezca el color de primer plano en rojo
  10. Ingrese las siguientes palabras clave "MALAS" en el primer grupo:
    temp temporary scanning X-Prod
  11. Haga clic en [Styler] debajo del segundo grupo y establezca el color de primer plano en azul
  12. Ingrese las siguientes palabras clave "BUENAS" en el segundo grupo:
    rushmore index
  13. Ingrese Ext.:fuera

Pensamientos finales

A diferencia de SQL Server, el motor de base de datos Jet/ACE no le permite modificar directamente los planes de ejecución de consultas. Eso significa que podemos mirar dentro de la caja negra con JetShowPlan, pero no podemos reconfigurarlo para que haga lo que queremos. En su lugar, tenemos que centrarnos en lo que podemos controlar:el SQL exacto que alimentamos y los índices y relaciones entre las tablas involucradas.

Usar JetShowPlan tiene beneficios tanto a corto como a largo plazo. A corto plazo, la función le permite solucionar los cuellos de botella en sus aplicaciones de Access. A largo plazo, obtiene información sobre el funcionamiento interno de Access, lo que le ayuda a evitar los cuellos de botella en primer lugar.