/ / cómo resolver la consulta de TSQL de ejecución lenta - sql, sql-server, tsql

cómo resolver una consulta TSQL de ejecución lenta - sql, sql-server, tsql

Tengo un problema con una consulta de ejecución lenta. He analizado la consulta con el generador de perfiles del servidor SQL pero no puedo encontrar una buena solución. Encontré por qué está funcionando lento. Si le pido al conjunto de datos completo, me devuelve 150 filas en 10 segundos, si agrego las sumas y los cálculos, me devuelve 18 filas pero toma 8min.

En el perfil del servidor sql descubrí que elel conjunto de datos completo hace aproximadamente 1 000 000 lecturas y la suma de la consulta sobre 82 000 000. Pero no sé cómo o por qué está obteniendo muchos registros. Debido a que el conjunto de datos completo es la selección secundaria de la consulta de suma.

la consulta a continuación es un ejemplo, no la consulta real (la consulta real también tiene la unión de todas las "s" en la consulta secundaria, pero la consulta de la suma es básicamente la misma)

SELECT Sum(x) * 0.1,
Sum(y),
a
FROM   (SELECT x,
y
FROM   tx
INNER JOIN ty ON tx.a = ty.a
WHERE  x = 1 --this returns 150 rows in 10s
) sub
GROUP  BY a -- sum returns 18row 8min

¿Puede alguien ayudarme con alguna prueba más que deba hacer o con una solución que pueda probar? Plan de ejecución de primera pieza Segunda pieza Tercera pieza

Respuestas

0 para la respuesta № 1

Intente dividir la consulta en 2 pasos utilizando una tabla temporal para eliminar la consulta secundaria:

-- populate temp table
SELECT x, y, a
INTO #TEMP
FROM   tx INNER JOIN ty ON tx.a = ty.a
WHERE  x = 1

-- query the temp table
SELECT Sum(x) * 0.1,
Sum(y),
a
FROM #TEMP
GROUP BY a

0 para la respuesta № 2

Yo sugeriría hacer las agregaciones dos veces. En tu ejemplo, esto parece un poco no sensitivo, pero la estructura es:

SELECT sum(x), sum(y)
Sum(y),
a
FROM   (SELECT a, sum(x) * 0.1 as x, sum(y) as y
FROM tx INNER JOIN
ty
ON tx.a = ty.a
WHERE  x = 1 --this returns 150 rows in 10s
GROUP BY a
) sub
GROUP  BY a ;

SQL debería hacer un mejor trabajo agregando en las tablas individuales, combinando los resultados y volviendo a agregar que lo que haría al agregar en una union De las mesas individuales. Además, si estás usando union en lugar de union all, eso afectará el rendimiento.