Esto es ante todo una cuestión de rendimiento. Está lidiando con un código de bajo rendimiento de su parte y debe identificar el cuello de botella y solucionarlo. Estoy hablando de los malos 2 segundos rendimiento ahora. Siga las pautas en Cómo analizar el rendimiento de SQL Server . Una vez que obtenga esta consulta para que se ejecute localmente de forma aceptable para una aplicación web (menos de 5 ms), puede plantear la cuestión de trasladarla a Azure SQL DB. En este momento, su cuenta de prueba solo destaca las ineficiencias existentes.
Después de la actualización
...
@iddepartment int
...
iddepartment='+convert(nvarchar(max),@iddepartment)+'
...
¿así que qué es lo? es el iddepartment
columna an int
o un nvarchar
? ¿Y por qué usar (max)
?
Esto es lo que debe hacer:
- parametrizar
@iddepartment
en el SQL dinámico interno - deja de hacer
nvarchar(max)
conversión. Haz eliddepartment
y@iddertment
coincidencia de tipos - asegurar índices en
iddepartment
y todos losidkpi
s
Aquí se explica cómo parametrizar el SQL interno:
set @sql =N'
Select * from (
select kpiname, target, ivalues, convert(decimal(18,2),day(idate)) as iDay
from kpi
inner join kpivalues on kpivalues.idkpi=kpi.idkpi
inner join kpitarget on kpitarget.idkpi=kpi.idkpi
inner join departmentbscs on departmentbscs.idkpi=kpi.idkpi
where [email protected]
group by kpiname,target, ivalues,idate)x
pivot
(
avg(ivalues)
for iDay in (' [email protected] + N')
) p'
execute sp_executesql @sql, N'@iddepartment INT', @iddepartment;
Los índices de cobertura son, con mucho, la solución más importante. Eso obviamente requiere más información de la que está aquí presente. Lea Diseño de índices incluidos todos los subcapítulos.
Como comentario más general:este tipo de consultas se adaptan a columnstores más que el almacén de filas, aunque creo que el tamaño de los datos es, básicamente, pequeño. Azure SQL DB admite índices de almacén de columnas agrupados actualizables, puede experimentar con él antes de un tamaño de datos importante. Requieren Empresa/Desarrollo en el cuadro local, cierto.