Access - Mejorar el rendimiento de mi BDD

 
Vista:
sin imagen de perfil
Val: 11
Ha aumentado su posición en 10 puestos en Access (en relación al último mes)
Gráfica de Access

Mejorar el rendimiento de mi BDD

Publicado por Gonzalo (14 intervenciones) el 15/02/2017 10:16:42
Muy buenas, os comento mi caso para ver si consigo alguna buena idea que me ayude:

Tengo una tabla con 3 campos que me interesan consultar. Además necesito crear un campo calculado(mediante la función Máx) utilizando estos 3 anteriores campos. Para ello hago una consulta simple donde añado mis tres campos de la tabla y creo mi campo calculado. Esta consulta es un poco compleja por lo que tardas unos 2 o 3 segundos en ejecutarse. Ahora es cuando viene mi duda.

Opción A) Sobre esta consulta con mis 4 campos vitales, empiezo a crear consultas adicionales, que me den los datos que deseo, pero poco a poco el rendimeitno es peor, y la última y definitiva que es la que me interesa, apenas se ejecuta o tarda muchísimo tiempo. Por lo que está opción se me hace imposible,

Opción B) He usado la opción de crear tabla a partir de una consulta. Si lo hago con los 3 campos iniciales, no ha ningún problema. Pero cuando lo hago con los 3 campos iniciales más el campo calculado...tampoco responde el ordenador.

Alguien me puede dar una idea o recomendación que me haya pasado por alto?

Un saludo y gracias,

Que tengan buen día.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Manuel
Val: 391
Plata
Ha aumentado 1 puesto en Access (en relación al último mes)
Gráfica de Access

Mejorar el rendimiento de mi BDD

Publicado por Manuel (167 intervenciones) el 15/02/2017 11:07:00
No das suficiente información... por lo que yo entiendo tienes una tabla con X campos, de los cuales te interesan 3 en la consulta (al menos en una consulta) y un campo calculado que de el máximo de esos 3 campos... o es un máximo de un agrupamiento? Porque no es lo mismo.

Después sobre lo anterior, pues la usas como base (supongo que como subconsulta) para hacer otras consultas... y el resultado es lentísimo.

Pero no das la estructura de tablas, lo que buscas exactamente... porque en SQL suele haber varias formas de conseguir lo mismo y depende de cada caso unas formas son más eficientes que otras. Por ejemplo, muchas veces hay consultas tremendamente ineficientes porque, en lugar de usar una operación de conjunto, pues se ha usado otras formas... Aunque después depende del SGBD, porque por ejemplo Access no tiene todas las operaciones de conjuntos, solo UNION... Después hay que tener cuidado con las subconsultas, ofrecen una flexibilidad tremenda y facilitan mucho el trabajo... pero cuidado que dependiendo en donde vayan, pues se repetirá la subconsulta (y si esta no tiene subconsultas anidadas más profundas) por cada línea, etc... Danto unos problemas de rendimiento tremendos, que hacen que resulte más práctico generar tablas temporales, etc. Pero tampoco es hacer tablas temporales por hacerlas.

hasta luego
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 11
Ha aumentado su posición en 10 puestos en Access (en relación al último mes)
Gráfica de Access

Mejorar el rendimiento de mi BDD

Publicado por Gonzalo (14 intervenciones) el 16/02/2017 10:44:44
Hola Manuel,

Te paso un enlace para que puedas ver con mas información de lo que te hablo. Muchas de tus sugerencias ya las he tratado de usar pero no me dan el resultado esperado.

https://drive.google.com/open?id=0B2OxZFR5jiYJQnU4X0pKT243NU0

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Manuel
Val: 391
Plata
Ha aumentado 1 puesto en Access (en relación al último mes)
Gráfica de Access

Mejorar el rendimiento de mi BDD

Publicado por Manuel (167 intervenciones) el 16/02/2017 18:14:32
Hola Gonzalo,

lo he visto por encima y aunque hay bastantes registros (unos 68K),no es ese el problema... Tampoco directamente FormatoNumero (que es una función bastante pesada)... Sino que al final es como si hicieras unas 68K consultas sobre los 68K registros.... eso son el equivalente a trabajar con una tabla de casi cinco mil millones de registros. Porque cada DMax implica una consulta sobre todos los datos. Por tanto no te extrañe que vaya algo lenta.

Sinceramente ahora mismo no se me ocurre que hacer para hacerla más rápido, salvo que si no vas a usar todo, solo te interesa una combinación de 1 o 2 campos, pues luego restringir con parámetros y así no harías de todo. Si se me ocurre algo para hacerla más eficiente, te lo comentaré, pero no se me ocurre, ahora mismo, nada.

hasta luego
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Mejorar el rendimiento de mi BDD

Publicado por Anonimo (1 intervención) el 17/02/2017 20:45:51
Obtener una secuencia para generar una grafica (mejor en Excel) con los datos aportados tiene diferentes soluciones (aparte de utilizar VBA).

.- Una consulta intermedia (Agrupando):

SELECT Datos.KTR, Datos.ARTIKEL, Max(Datos.AUSF_TAG) AS Ultima
FROM Datos
GROUP BY Datos.KTR, Datos.ARTIKEL;



.- Una solución: fecha del ultimo movimiento y su anterior respectivo (de cada pareja KTR & ARTIKEL)

SELECT Datos.KTR, Datos.ARTIKEL, First(Agrupando.Ultima) AS Ultima, Max(Datos.AUSF_TAG) AS Anterior
FROM Datos LEFT JOIN Agrupando ON (Datos.ARTIKEL = Agrupando.ARTIKEL) AND (Datos.KTR = Agrupando.KTR)
WHERE (((Datos.AUSF_TAG)<[ultima]))
GROUP BY Datos.KTR, Datos.ARTIKEL;


.- Otra solución: En base al ultimo movimiento, la diferencia (en días) respecto a todos sus anteriores (aplicando las mismas condiciones de la anterior consulta)

SELECT Datos.KTR, Datos.ARTIKEL, First(Agrupando.Ultima) AS La_Ultima, Datos.AUSF_TAG AS Las_anteriores, Min([ultima]-[ausf_tag]) AS Dias_Diferencia
FROM Datos LEFT JOIN Agrupando ON (Datos.ARTIKEL = Agrupando.ARTIKEL) AND (Datos.KTR = Agrupando.KTR)
WHERE (((Datos.AUSF_TAG)<[ultima]))
GROUP BY Datos.KTR, Datos.ARTIKEL, Datos.AUSF_TAG
ORDER BY Datos.KTR, Datos.ARTIKEL, Datos.AUSF_TAG DESC;



Espero que estos planteamientos sean útiles a la hora de encontrar soluciones especificas acordes a la necesidad.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
Imágen de perfil de Manuel
Val: 391
Plata
Ha aumentado 1 puesto en Access (en relación al último mes)
Gráfica de Access

Mejorar el rendimiento de mi BDD

Publicado por Manuel (167 intervenciones) el 17/02/2017 22:19:55
+1 Es muy buena tu respuesta... además tu lo haces sin convertir en número las fechas, que es lo ideal.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 11
Ha aumentado su posición en 10 puestos en Access (en relación al último mes)
Gráfica de Access

Mejorar el rendimiento de mi BDD

Publicado por Gonzalo (14 intervenciones) el 22/02/2017 16:48:53
Muchisimas gracias a todos por vuestra respuestas, he conseguido solucioanr el problema!

Ha sido vital vuestra colaboración para aplicar una consulta intermedia además de poner un índice a todos los elementos de la tabla inicial para mejorar el rendimiento.

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar