none
consulta SQL se demora mucho RRS feed

  • Pregunta

  • hola,

    tengo una consulta que agrupa con GROUP BY para hacer  la suma de tiempos, el caso es que esta consulta cuando la lanzo me tarda aproximadamente un minuto y medio, si la lanzo inmediatamente me tarda 3 segundos o así.

    el campo por el que agrupo es un datetime y tiene indice.

    la consulta es algo así:

    SELECT  TOP 20 CAST(localcol as date) as Fecha , COUNT (*)*5/60 as P3_Min_LL_LL 
         FROM [sgci].[dbo].[Log5Sec_PAST3a] 
    where [P3_Produccion_Pasos] <> 0  and [LL_LL] = 'True'  and localcol >= convert(varchar(20),dateadd(DAY,-60,getdate()),113)    GROUP BY CAST(localCol AS DATE) order by CAST(localcol as date) desc

    De media el GROUP BY  parte de 200000 filas , quedando estas agrupadas en 20.

    Hay alguna manera de hacer que esta consulta devuelva los datos de una forma mas rápida?

    Gracias

    lunes, 4 de septiembre de 2017 4:08

Respuestas

  • Asegúrate de que tienes un índice sobre los campos que usas en el Where (no los del GroupBY). Eso hará que sea más rápida la selección de registros que vas a agrupar. Examina desde SSMS el plan de ejecución, y si ves que pierde mucho tiempo saltando de ese índice al índice clustered, métele un INCLUDE para que cubra la consulta. Si esto te "suena" a chino y no entiendes bien cómo funcionan los índices o cómo optimizarlos, entonces usa el DETA (asistente para optimizar índices) y aplica las recomendaciones que te haga.

    • Propuesto como respuesta Dan Belmonte lunes, 4 de septiembre de 2017 13:13
    • Marcado como respuesta Moderador M lunes, 11 de septiembre de 2017 18:13
    lunes, 4 de septiembre de 2017 6:17
  • el caso es que esta consulta cuando la lanzo me tarda aproximadamente un minuto y medio, si la lanzo inmediatamente me tarda 3 segundos o así.

      Si haces un call la primera vez demorara el tiempo exacto que demora. Y la segunda , tercerna , n veces demorara mucho menos ya que ya se encuentra en memoria .

    Ahora vamos a como mejorar la consulta

    SELECT  TOP 20 CAST(localcol as date) as Fecha , COUNT (*)*5/60 as P3_Min_LL_LL 
         FROM [sgci].[dbo].[Log5Sec_PAST3a] 
    where [P3_Produccion_Pasos] <> 0  and [LL_LL] = 'True'  and localcol >= convert(varchar(20),dateadd(DAY,-60,getdate()),113)    GROUP BY CAST(localCol AS DATE) order by CAST(localcol as date) desc

    De media el GROUP BY  parte de 200000 filas , quedando estas agrupadas en 20.

    La pregunta del millon al final muestras todas?

    Primera puedes almacenar lo que vas a mostrar es decir en una tabla temporal haces un select de todo los registros con un where . Si de las 200000 filas te quedas con la mitad o menos reducira esto al hacer el GROUP BY luego para optimizar mas puedes hacer COUNT (*)*5/60 en el cliente

     

    Pasa los puntos prro v:

    • Propuesto como respuesta Jeisson Paez lunes, 4 de septiembre de 2017 18:40
    • Marcado como respuesta Moderador M lunes, 11 de septiembre de 2017 18:13
    lunes, 4 de septiembre de 2017 14:19

Todas las respuestas

  • Asegúrate de que tienes un índice sobre los campos que usas en el Where (no los del GroupBY). Eso hará que sea más rápida la selección de registros que vas a agrupar. Examina desde SSMS el plan de ejecución, y si ves que pierde mucho tiempo saltando de ese índice al índice clustered, métele un INCLUDE para que cubra la consulta. Si esto te "suena" a chino y no entiendes bien cómo funcionan los índices o cómo optimizarlos, entonces usa el DETA (asistente para optimizar índices) y aplica las recomendaciones que te haga.

    • Propuesto como respuesta Dan Belmonte lunes, 4 de septiembre de 2017 13:13
    • Marcado como respuesta Moderador M lunes, 11 de septiembre de 2017 18:13
    lunes, 4 de septiembre de 2017 6:17
  • el caso es que esta consulta cuando la lanzo me tarda aproximadamente un minuto y medio, si la lanzo inmediatamente me tarda 3 segundos o así.

      Si haces un call la primera vez demorara el tiempo exacto que demora. Y la segunda , tercerna , n veces demorara mucho menos ya que ya se encuentra en memoria .

    Ahora vamos a como mejorar la consulta

    SELECT  TOP 20 CAST(localcol as date) as Fecha , COUNT (*)*5/60 as P3_Min_LL_LL 
         FROM [sgci].[dbo].[Log5Sec_PAST3a] 
    where [P3_Produccion_Pasos] <> 0  and [LL_LL] = 'True'  and localcol >= convert(varchar(20),dateadd(DAY,-60,getdate()),113)    GROUP BY CAST(localCol AS DATE) order by CAST(localcol as date) desc

    De media el GROUP BY  parte de 200000 filas , quedando estas agrupadas en 20.

    La pregunta del millon al final muestras todas?

    Primera puedes almacenar lo que vas a mostrar es decir en una tabla temporal haces un select de todo los registros con un where . Si de las 200000 filas te quedas con la mitad o menos reducira esto al hacer el GROUP BY luego para optimizar mas puedes hacer COUNT (*)*5/60 en el cliente

     

    Pasa los puntos prro v:

    • Propuesto como respuesta Jeisson Paez lunes, 4 de septiembre de 2017 18:40
    • Marcado como respuesta Moderador M lunes, 11 de septiembre de 2017 18:13
    lunes, 4 de septiembre de 2017 14:19
  • Fuera de las optimizaciones que estás viendo, lo que mencionas de la diferencia de tiempo es porque primero estácreando un plan de ejecución lo suficientemente bueno, luego va a disco y sube los resultados a memoria y hace el proceso, la segunda vez que haces esto sino a pasado mucho tiempo ni has limpiado el pool de datos en memoria los traerá de memoria la cual es mucho mas rápida y por eso la gran diferencia de tiempo.
    lunes, 4 de septiembre de 2017 19:56