SQL - Optimizar consulta

 
Vista:
Imágen de perfil de Oriol

Optimizar consulta

Publicado por Oriol (4 intervenciones) el 11/01/2007 17:19:18
Haber como lo planteo: tengo que crear un listado resultante de una consulta sobre un registro de entradas en un parking. En dicho listado deben aparecer aquellas matriculas que no existen en la BD y que hayan entrado en los ultimos 3 meses, apareciendo como datos necesarios la fecha de la ultima entrada y el numero de veces que ha entrado.
Ahora mismo hago el listado en tres pasos, primero obtengo las distintas matriculas:

SELECT DISTINCT([Registro].[Matricula]) FROM [Registro] WHERE ([Registro].[Acceso] = 0) AND ([Registro].[Sentido] = 1) AND ([Registro].[Fecha] >= FORMAT(NOW-90,"YYYYMMDD")) AND NOT EXISTS (SELECT * FROM [Matriculas] WHERE ([Registro].[Matricula] = [Matriculas].[Codigo]))

Luego, recorro cada matricula (en un recordset) y hago una busqueda de su ultima fecha y hora:

SELECT TOP 1 [Registro].[Fecha], [Registro].[Hora] FROM [Registro] WHERE ([Registro].[Sentido] = 1) AND ([Registro].[Matricula] = '" & rsMATR("Matricula") & "') ORDER BY [Registro].[Fecha] DESC, [Registro].[Hora] DESC

Y por ultimo obtengo el contador con el numero de veces que ha entrado:

SELECT COUNT(*) AS [CONTADOR] FROM [Registro] WHERE ([Registro].[Sentido] = 1) AND ([Registro].[Matricula] = '" & rsMATR("Matricula") & "') AND ([Registro].[Fecha] >= FORMAT(NOW-90,"YYYYMMDD"))

Todos los datos los pongo en una rejilla y punto. El problema me viene en que, aunque funciona, tarda muchisimo.
¿A alguien se le ocurre como acortar las consultas o algo asi para optimizar el tiempo?

Muchas gracias.
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

RE:Optimizar consulta

Publicado por Isaías (5072 intervenciones) el 11/01/2007 17:42:50
¿Que base de datos manejas?

¿Como que NO EXISTEN en la base, pero si tienen registro de ENTRADA?, ¿puede suceder esto?
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 Oriol

RE:Optimizar consulta

Publicado por Oriol (4 intervenciones) el 11/01/2007 17:50:07
Haber, el registro de la matricula se hace por reconocimiento optico, esto permite que el vehiculo entre en el parking. Aparte, esta una tabla en la base de datos que tiene las matriculas "vips" por decirlo de alguna manera.

La sql la hago contra una base de datos Microsoft Access.
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

RE:Optimizar consulta

Publicado por Liliana (426 intervenciones) el 12/01/2007 16:25:40
Hola,
No sé en Access, pero en MS SQL Server, esa consulta haría lo que necesitás en un solo paso, si no sirve, a lo mejor te da una idea de lo que podrías hacer:

SELECT MaxFecha.*, MAX( [Registro].[Hora] ) AS UltHora
FROM
( SELECT [Registro].[Matricula] Matric,
MAX( [Registro].[Fecha] ) AS UltFecha,
COUNT(*) AS [CONTADOR]
FROM [Registro]
LEFT JOIN [Matriculas] ON ([Registro].[Matricula] = [Matriculas].[Codigo])
WHERE ([Registro].[Acceso] = 0) AND
([Registro].[Sentido] = 1) AND
([Registro].[Fecha] >= FORMAT(NOW-90,"YYYYMMDD")) AND
([Matriculas].[Codigo] IS NULL)
GROUP BY [Registro].[Matricula] ) MaxFecha
INNER JOIN [Registro] ON [Registro].[Matricula] = Matric AND Fecha = UltFecha
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 Oriol

RE:Optimizar consulta

Publicado por Oriol (4 intervenciones) el 15/01/2007 10:55:06
Muchas gracias.

La sql funciona salvo por el tema de la hora. Me dice que "Matric" no pertenece al campo agregado y no es posible incluirla. Si en vez de poner el Max([Registro].[Hora]) AS [UltHora] pongo los valores de la hora sin mas ([Registro].[Hora]) la consulta me sale correcta salvo que, para una misma matricula que haya tenido el mismo dia (su ultima fecha) mas de un registro (por ejemplo, que tenga una entrada y una salida del parking, lo que corresponderia [Registro].[Sentido] a los valores 1 y 2) aparecen dos registros.

Si veo que no se como solucionarlo intentare omitir la hora del resultado final y punto.
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 Oriol

Ok. Gracias

Publicado por Oriol (4 intervenciones) el 16/01/2007 16:47:20
Ya esta solucionado el tema. Muchas gracias.
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