Tengo un problema con una consulta relativamente simple y el plan de ejecución de acceso elige para ello.¿Cómo puedo hacer que MS-Access elija un plan de ejecución diferente/correcto para mi consulta
la consulta es de esta forma
SELECT somethings
FROM A INNER JOIN (B INNER JOIN (C INNER JOIN D ON ...) ON ...) ON ...
WHERE A.primaryKey= 1 AND D.d = 2;
C y D tienen relativamente pocas filas. A y B tienen algunas miles filas.
La consulta, que devuelve 2 filas (no estoy seguro si esto es pertinente) es realmente lenta. Se ejecuta en 17 segundos. Si elimino la parte AND D.d = 2
de la cláusula where, la consulta ahora devuelve 4 filas y se ejecuta instantáneamente.
Por lo tanto, entiendo que el motor JET podría ejecutar la consulta sin el filtro en D.d al instante, luego ejecutar dicho filtro al instante (solo 4 filas para filtrar). Por lo tanto, no debería ser demasiado tiempo para ejecutar la consulta con el filtro D.d = 2
.
Intenté crear una sub consulta sin el filtro e incluir esto en otra consulta que solo filtraría el resultado, pero aún es lento. Supongo que el motor JET es lo suficientemente inteligente como para "aplanar" las consultas secundarias, por lo que el resultado es el mismo.
Como no pude ejecutar la consulta como deseaba, utilicé el objeto JETSHOWPLAN para que Access publicara su plan de ejecución. Esto es lo que encontré:
Para la consulta rápida (la que no tiene D.d = 2
), el primer paso del plan de consulta es aplicar el filtro A.primaryKey = 1
en la tabla A. Esto da como resultado un conjunto de datos de 1 fila de más de 30000. Luego, las uniones parecen ejecutarse de A a D usando un índice con un conjunto de datos que nunca supera las 4 filas.
Parece que la consulta lenta se ejecuta en el orden inverso. D y C se unen primero, luego se prueba D.d = 2
. Después de eso, se ejecutan las uniones de C a A. De esta manera, los datos que se deben unir de D a C, de C a B y de B a A son mucho más grandes. Cuando se ejecutan todos los JOIN y antes de que se ejecute A.primaryKey=1
, el conjunto de datos tendrá 120,000 filas.
¿Hay alguna manera de forzar el plan de consulta correcto en Access?
Espero haber sido claro. Avíseme si debería publicar los planes de consulta. No lo hice porque son bastante grandes.
Gracias de antemano,
MP
Puesto que no puede proporcionar pistas para el planificador de consulta, me sospecha que eres SOL. Si esto es crítico para el rendimiento, puede adjuntar la parte rápida de la consulta en una tabla borrador y usarla para otra consulta 'D.d = 2'. Sé que suena desagradable (¡lo es!), Pero no sé qué más podrías hacer aparte de vivir con la lentitud de la única consulta que tienes ahora. – HansUp
@HansUp: gracias por su aporte. Temía que tendría que usar un truco tan feo, pero si no puedo encontrar otra solución, tendré que usar una. Mis usuarios esperan el resultado de esta consulta un par de veces al día y 17 segundos es mucho tiempo cuando todo lo que haces es mirar fijamente a la pantalla. –