Cita: Uso GROUP BY porque el aplicativo que hace INSERTS en esa tabla repite registros con lo cual tengo algunos registros con fecha_hora iguales.
Uso el ORDER BY para que apareza del primer registro del día al último registro del día.
Eso
ya te lo había entendido. Mi intención es que comprendas que uno de tus problemas es que estés
necesitando usar esas cláusulas,
porque son esas cláusulas las que ayudan a que sea lento.
Lo mejor sería no tener que usarlas, y para ello hay algunas alternativas, como la que te menciono al final de mi post.
Cita: Uso el WHERE con la fecha y hora ya que el usuario tiene un formulario como el siguiente:
FECHA ON: 01/01/2012 00:00:00
FECHA OFF: 12/03/2012 13:00:00
Lo que el usuario vea en su formulario en este caso es irrelevante. Lo que importa es el rango de datos que estás buscando en la consulta:
Lo que traducido a una frase sería: "Todo lo igual o posterior al primer segundo del 09/02/2012, y anterior o igual al último segundo del día 09/02/2012".
Y eso es lo mismo que poner:
Con la diferencia que la primera necesita 8 Bytes por dato y la otra 3. Lo que a nivel de procesamiento hace una buena diferencia.
Por otro lado, respecto a que dos ejecuciones tarden diferente, aún con los mismos datos, no es extraño, porque la resolución de los planes de consulta por el parser puede variar de acuerdo a los rsultados de las consultas anteriores. No te olvides que el parser trabaja estadísticamente.
Y precisamente por ese nivel de análisis que hace, el hecho de que haya una cardianlidad elevada entre diferentes valores, impacta en el mayor o menor tiempo en que una consulta se ejecuta.
Yo te sugeriría que antes de seguir adelante, primero debes depurar las tablas para suprimir los duplicados, porque eso puede estar causando enorme redundancia, que se refleja en una mala performance de la consulta.