none
Vista tarda mucho tiempo en devolver datos RRS feed

  • Pregunta

  • Hola,mi consulta es la siguiente,esto me esta pasando con varias vistas con las que estoy trabajando que de un momento a otro

    la misma empezo a demorar hasta 4 minutos para traerme 4000 registros,lo cual antes lo hacia tardando como mucho 1 segundo.

    Dejo la consulta y agradezco de antemano y espero me sepan dar un guia de como resolver esto.

    SELECT     dbo.HojasDeRuta_Contable.gid_hojaderuta, ISNULL([KILOMETROS], 0) AS [Km nacional], 
                          /*--CASE WHEN dbo.Rutas_Cotizaciones.gkmc = 'SI' THEN dbo.HojasDeRuta_Contable.gkmnacional ELSE '0' END AS [Km nacional],*/ CAST(ISNULL([KILOMETROS] * [KILOMETROS PRECIO UNITARIO],
                           0) AS DECIMAL(18, 2)) AS [Total km nacional], 
                          /* 2)) AS [Total km nacional],*/ CAST(ISNULL(CASE WHEN [HORAS INCLUIDAS] > 0 THEN CASE WHEN HORAS - [HORAS INCLUIDAS] <= 0 THEN '0' ELSE HORAS - [HORAS INCLUIDAS]
                           END ELSE HORAS END, 0) AS INT) AS Horas, 
                          CAST(ISNULL(CASE WHEN [HORAS INCLUIDAS] > 0 THEN CASE WHEN HORAS - [HORAS INCLUIDAS] <= 0 THEN 0 ELSE HORAS - [HORAS INCLUIDAS] END * [HORAS PRECIO UNITARIO]
                           ELSE HORAS * [HORAS PRECIO UNITARIO] END, 0) AS INT) AS [Total Horas], /*END AS [Total Horas],*/ ISNULL(CASE WHEN HORAS > 0 THEN MINUTOS ELSE '0' END,
                           0) AS Minutos, 
                          /*CASE WHEN dbo.Rutas_Cotizaciones.ghorasc = 'SI' THEN dbo.HojasDeRuta_Contable.gminutos ELSE '0' END AS Minutos, */ CAST(CASE WHEN MINUTOS > 0 THEN MINUTOS
                           * [MINUTOS PRECIO UNITARIO] ELSE '0' END AS decimal(18, 2)) AS [Total minutos], 
                          /* 2)) AS [Total minutos],*/ CAST(ISNULL(CASE WHEN VIAJE > 0 THEN VIAJE ELSE '0' END, 0) AS INT) AS Viaje, 
                          /*CASE WHEN dbo.Rutas_Cotizaciones.gviajec = 'SI' THEN dbo.HojasDeRuta_Contable.gviaje ELSE '0' END AS Viaje,*/ CAST(CASE WHEN VIAJE > 0 THEN [VIAJE PRECIO UNITARIO]
                           * VIAJE ELSE '0' END AS decimal(18, 2)) AS [Total viaje], CAST(ISNULL([TIPO DE VEHICULO], 0) AS int) AS [Tipo de vehiculo], 
                          CAST(ISNULL([TIPO DE VEHICULO] * [TIPO DE VEHICULO PRECIO UNITARIO], 0) AS decimal(18, 2)) AS [Total Tipo de vehiculo]
    /* 2)) AS [Total viaje]*/ FROM dbo.HojasDeRuta_Contable INNER JOIN
                          dbo.Clientes_Prestaciones ON dbo.HojasDeRuta_Contable.gid_prestacion = dbo.Clientes_Prestaciones.gid_prestacion LEFT JOIN
                              (SELECT     a.gid_hojaderuta, a.gid_prestacion, a.HORAS, a.[TIPO DE VEHICULO], a.VIAJE, a.KILOMETROS, a.MINUTOS, a_2.[HORAS] AS [HORAS PRECIO UNITARIO], 
                                                       a_2.[TIPO DE VEHICULO] AS [TIPO DE VEHICULO PRECIO UNITARIO], a_2.[VIAJE] AS [VIAJE PRECIO UNITARIO], 
                                                       a_2.[KILOMETROS] AS [KILOMETROS PRECIO UNITARIO], a_2.[MINUTOS] AS [MINUTOS PRECIO UNITARIO], 
                                                       a_4.[TIPO DE VEHICULO] AS gid_tipodevehiculo, a_5.[VIAJE] AS [HORAS INCLUIDAS]
                                FROM          hojasderuta_contable b LEFT OUTER JOIN
                                                           (SELECT     a.gid_hojaderuta, gid_prestacion, b.gdescripcion, a.gcantidad
                                                             FROM          HojasDeRuta_Contable_Items a INNER JOIN
                                                                                    SIS_Clientes_Prestaciones_TiposDeValor b ON a.gid_tipodevalor = b.gid_tipodevalor
                                                             WHERE      a.activo = 1) AS src PIVOT (max(gcantidad) FOR gdescripcion IN ([HORAS], [VIAJE], [TIPO DE VEHICULO], [KILOMETROS], [MINUTOS])) 
                                                       AS a ON a.gid_hojaderuta = b.gid_hojaderuta LEFT JOIN
                                                           (SELECT     n.gid_hojaderuta, gid_prestacion, n.gpreciocompra, b.gdescripcion AS descripcion_1
                                                             FROM          HojasDeRuta_Contable_Items n INNER JOIN
                                                                                    SIS_Clientes_Prestaciones_TiposDeValor b ON n.gid_tipodevalor = b.gid_tipodevalor
                                                             WHERE      n.activo = 1) AS src_1 PIVOT (max(gpreciocompra) FOR descripcion_1 IN ([HORAS], [TIPO DE VEHICULO], [VIAJE], [KILOMETROS], 
                                                       [MINUTOS])) AS a_2 ON a_2.gid_hojaderuta = b.gid_hojaderuta LEFT JOIN
                                                           (SELECT     f.gid_hojaderuta, f.gid_prestacion, f.gid_tipovehiculo, b.gdescripcion AS descripcion_2
                                                             FROM          HojasDeRuta_Contable_Items f INNER JOIN
                                                                                    SIS_Clientes_Prestaciones_TiposDeValor b ON f.gid_tipodevalor = b.gid_tipodevalor
                                                             WHERE      f.activo = 1) AS src_1 PIVOT (max(gid_tipovehiculo) FOR descripcion_2 IN ([TIPO DE VEHICULO])) AS a_4 ON 
                                                       a_4.gid_hojaderuta = b.gid_hojaderuta LEFT JOIN
                                                           (SELECT     f.gid_hojaderuta, f.gid_prestacion, b.gdescripcion AS descripcion_2, c.ghorasincluidas
                                                             FROM          HojasDeRuta_Contable_Items f INNER JOIN
                                                                                    SIS_Clientes_Prestaciones_TiposDeValor b ON f.gid_tipodevalor = b.gid_tipodevalor INNER JOIN
                                                                                    Clientes_Prestaciones_ImportesDeLiquidacion AS c ON f.gid_prestacion = c.gid_prestacion AND F.gid_tipodevalor = C.gid_tipodevalor AND 
                                                                                    f.gid_tipovehiculo = c.gid_tipodevehiculo
                                                             WHERE      f.activo = 1) AS src_1 PIVOT (max(ghorasincluidas) FOR descripcion_2 IN ([VIAJE])) AS a_5 ON a_5.gid_hojaderuta = b.gid_hojaderuta) 
                          AS a_3 ON dbo.HojasDeRuta_Contable.gid_hojaderuta = a_3.gid_hojaderuta
    WHERE     (dbo.HojasDeRuta_Contable.activo = 1)


    jueves, 10 de agosto de 2017 21:27

Respuestas

  • Si antes iba deprisa y ahora va despacio, puede ser un problema de optimización. Tal vez antes, con pocos datos, te usaba unos índices determinados, y al haber aumentado el número de registros en las tablas resulta que ahora el optimizador de consultas ya no usa los mismos índices, o le faltan algunos índices que con pocos registros no eran necesarios.

    Pídele desde SSMS el plan de ejecución de la vista, y examínalo. A veces el propio SSMS ya te indica "Missing Index..." y te dice el índice que necesita. De lo contrario, examina el plan de ejecución y fíjate en qué pasos indica que se pierde más tiempo. Eso te debería dar una idea sobre qué índices faltan, o qué optimizaciones habría que hacer para mejorar la consulta.

    • Marcado como respuesta Moderador M martes, 15 de agosto de 2017 18:19
    viernes, 11 de agosto de 2017 8:07

Todas las respuestas

  • Si antes iba deprisa y ahora va despacio, puede ser un problema de optimización. Tal vez antes, con pocos datos, te usaba unos índices determinados, y al haber aumentado el número de registros en las tablas resulta que ahora el optimizador de consultas ya no usa los mismos índices, o le faltan algunos índices que con pocos registros no eran necesarios.

    Pídele desde SSMS el plan de ejecución de la vista, y examínalo. A veces el propio SSMS ya te indica "Missing Index..." y te dice el índice que necesita. De lo contrario, examina el plan de ejecución y fíjate en qué pasos indica que se pierde más tiempo. Eso te debería dar una idea sobre qué índices faltan, o qué optimizaciones habría que hacer para mejorar la consulta.

    • Marcado como respuesta Moderador M martes, 15 de agosto de 2017 18:19
    viernes, 11 de agosto de 2017 8:07
  • Muchas gracias por la orientacion.

    Saludos.

    viernes, 11 de agosto de 2017 20:20