Principales respuestas
Vista tarda mucho tiempo en devolver datos

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)
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
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
-
Muchas gracias por la orientacion.
Saludos.
- Marcado como respuesta Sanchez Alejandro viernes, 11 de agosto de 2017 20:20
- Desmarcado como respuesta Sanchez Alejandro viernes, 11 de agosto de 2017 20:20