PDA

Ver la Versión Completa : Como acelerar búsqueda de valores extremos?


salvica
23-11-2008, 17:58:53
Pues eso, lo del encabezamiento

Tengo una tabla con cuatro campos (Clave, Fecha, Hora y Valor) y necesito sacar el máximo, el mínimo y las horas en que se producen de un día determinado.

Hasta ahora lo hago en dos pasos para cada valor (por ejemplo, para el 23-10-2008):
1º - Consulto los valores extremos

SELECT MIN(valor) AS minimo, MAX(valor) AS minimo
FROM tabla
WHERE fecha="2008-10-23"

2º - Consulto las fechas en que se producen los valores extremos

SELECT hora
FROM tabla
WHERE fecha="2008-10-23"
AND valor=MINIMO
SELECT hora
FROM tabla
WHERE fecha="2008-10-23"
AND valor=MAXIMO

La cosa funciona, pero da la impresión de quedarse "colgado" el sistema (osea que tarda demasiado), por eso mi pregunta ¿Hay alguna otra forma para acelerar el resultado?

Gracias de antemano
Salvica

coso
23-11-2008, 20:18:53
Hola, prueba de no usar las comillas en la comparacion de 'fecha'

RUBICON
23-11-2008, 20:42:10
Si son tablas con mucha informacion, una solucion es crear indices y realizar las busquedas implementando los mismos.

salvica
23-11-2008, 21:43:34
Hola, prueba de no usar las comillas en la comparacion de 'fecha'
Gracias coso, se me olvidó poner en el hilo que utilizo MySql y los ejemplos que he visto vienen así (hasta la fecha no he tenido problemas)

Si son tablas con mucha informacion, una solucion es crear indices y realizar las busquedas implementando los mismos.
Hola COSO. Efectivamente, las tablas tienen mucha información.

De todas formas creo que lo he solucionado revisando este hilo (http://www.clubdelphi.com/foros/showthread.php?t=61526), donde poliburro trata algo parecido

Lo dicho, gracias a todos y si no hay más aportaciones doy el hilo por cerrado
Salvica

poliburro
24-11-2008, 15:29:56
Select Tabla.*
FROM tabla Tabla
Inner join (
SELECT str_to_date("2008-10-23", '%Y-%m-%d') Fecha,
MIN(valor) AS minimo,
MAX(valor) AS minimo
FROM tabla
WHERE fecha="2008-10-23"
) Filtro
On Tabla.Fecha = filtro.Fecha And
( Tabla.Valor = filtro.Máximo Or Tabla.Valor = Filtro.Minimo)

salvica
25-11-2008, 05:09:50
Hola poliburro, he intentado adaptar tu consulta y, o no he sabido hacerla :mad:, o el resultado no es el que me esperaba :eek: (saca todo revuelto)

En realidad necesito un consulta que me devuelva el valor máximo (o el mínimo), o mejor los dos :D, con las horas en que se producen dichos eventos (puede ser una o varias, depende de si se repite al cabo del tiempo)

Según el hilo tuyo que puse en el mensaje anterior, hice lo siguiente:

SQL.Add( 'CREATE OR REPLACE VIEW z_view_extrema AS' );
SQL.Add( 'SELECT *' );
SQL.Add( ' FROM z_view_media1min' );
SQL.Add( ' WHERE (valor=(SELECT MIN(valor) AS minima' );
SQL.Add( ' FROM z_view_media1min' );
SQL.Add( ' )' );
SQL.Add( ' )' );
SQL.Add( ' ORDER BY clave' );

z_view_media1min es una vista en la que ya tengo almacenados los valores de un día determinado (unos 8600 más o menos) y consta (al igual que las tablas padres) de Clave, Fecha, Hora y Valor

La cuestión es que cuando le pido los valores extremos (máximo y mínimo) parece que "se eterniza" (o por lo menos esa es mi impresión), por eso mi pregunta.

De todas formas, muy buenas tus explicaciones en otros hilos.
Gracias
Salvica

poliburro
26-11-2008, 18:05:35
Hola poliburro, he intentado adaptar tu consulta y, o no he sabido hacerla :mad:, o el resultado no es el que me esperaba :eek: (saca todo revuelto)

En realidad necesito un consulta que me devuelva el valor máximo (o el mínimo), o mejor los dos :D, con las horas en que se producen dichos eventos (puede ser una o varias, depende de si se repite al cabo del tiempo)




Ok, entonces igual te conviene indexar el campo valor y generar la vista de esta manera:



CREATE OR REPLACE VIEW z_view_extrema AS
SELECT media.*
FROM z_view_media1min media
inner join (
SELECT MIN(valor) AS minima, Max(valor) Maximo
FROM z_view_media1min
) Filtro
On media.Valor = filtro.Maximo Or
media.Valor = filtro.Minimo
ORDER BY clave




de esta manera obtienes todos los registros en media cuyo valor es igual al máximo o igual al mínimo. Indexar el campo valor te ayudará a mejorar la velocidad de la consulta.


Saludos

coso
26-11-2008, 20:05:26
hola, no se bien bien si es lo que buscas, pero


select horas from tabla where (valor = (select max(valor) from tabla) or valor = (select min(valor) from tabla)


no te daria el resultado? (quiza lo entendi mal)

coso
26-11-2008, 20:07:39
Sobre el rendimiento, no estoy seguro...pero me da la impresion que si pones date como una string, el servidor sql la pasa a datetime...quiza si sacases las comillas :confused: (ya te digo que no estoy seguro, no conozco a fondo MySQL)