Como calcular un acumulado de forma eficiente con TSQL


En algunas oportunidades necesitamos hacer alguna consulta que nos genere una acumulado de valores, por ejemplo si tenemos una tabla con transacciones poder ir viendo la evolución del saldo para un articulo transacción por transacción.

Este tipo de consultas suelen ser un tanto complejas de resolver y además por lo general poco eficientes.

Por suerte a partir de SQL Server 2012 tenemos la posibilidad de usar las Windows Function las cuales son muy poderosas.

Lo que haremos en este articulo es poder evaluar sobre nuestra base de datos AdventiureWorks2012 o 2014 las diferentes opciones que tenemos para poder calcular un acumulado comparándolos en performance a cada uno de ellos.

Básicamente lo que deseamos obtener es una consulta donde su resultado sea como la siguiente figura donde la columna balance muestra el acumulado de las cantidades para un producto dado transacción por transacción.

image

Cursores:

Podríamos utilizar un curso para esta consulta el cual su código seria algo así como:

 

Sub Consultas

Otra alternativa podría ser la utilización de subconsultas

Window Function

Como comente al principio estas funciones se las puede usar a partir de SQL 2012 y lo que resuelven básicamente es la utilización de OVER en las funciones de agregación como el SUM, MIN, MAX, etc.

Veamos como se haría la misma consulta pero usando estas nuevas opciones.

Comparativas en performance y uso de recursos

Lo ultimo que nos quedaría hacer es poder medir los impactos en performance de cada solución y los recursos consumidos, para ello utilice profiler y exponer los resultados en los siguientes gráficos:

Solución

Tiempo ms

Reads

CPU

Sub consulta

24290

804644

69938

Cursores

5948

573391

4140

Window Function

978

876

451

 

image

image

image

 

Conclusiones

Los números hablan por si solos, la diferencia de usar Window Function es insuperable tanto en los tiempos de proceso como en los recursos consumidos.