Tengo una tabla base con transacciones y necesito crear una tabla con totales acumulados. Necesito que sean por cuenta y que también tengan algunos totales acumulados para cada cuenta (según el tipo de transacción), y dentro de eso, algunos totales acumulados por subcuenta.
Mi tabla base tiene estos campos (más o menos):
AccountID | SubAccountID | TransactionType | TransactionAmount
Teniendo en cuenta que tengo alrededor de 4 tipos de totales acumulados por Cuenta / TransactionType y 2 totales acumulados más por Cuenta / SubCuenta / TransactionType, y tengo alrededor de 2 millones de cuentas con aproximadamente 10 subcuentas cada una, y obtengo aproximadamente 10K transacciones cada minuto (a carga máxima), ¿cómo lo harías?
También es imprescindible que esto se ejecute de forma asincrónica a través de un trabajo de SQL, creando las agregaciones sin ser parte de las transacciones en sí.
Estoy bastante atrapado usando un cursor aquí, lo que lleva demasiado tiempo. Realmente agradecería cualquier consejo / artículo que haga más o menos lo mismo.
fuente
Respuestas:
Asíncrono implica que los totales acumulados no necesitan ser completamente exactos en todo momento, o sus patrones de cambio de datos son tales que una compilación total consecutiva será válida y precisa hasta la próxima carga. De todos modos, estoy seguro de que has pensado en eso, así que no voy a insistir.
Sus opciones principales para un método compatible de alto rendimiento son una función / procedimiento SQLCLR o un
UPDATE
método de iteración basado en conjuntos basado en Hugo Kornelis. El método SQLCLR (implementado en un procedimiento, pero razonablemente fácil de traducir) se puede encontrar aquí .No he podido encontrar el método de Hugo en línea, pero se detalla en el excelente MVP Deep Dives (Volumen 1). A continuación se muestra un código de muestra para ilustrar el método de Hugo (copiado de una de mis publicaciones en otro sitio para el que no tiene un inicio de sesión):
En SQL Server 2012, puede usar las extensiones de función de ventanas, por ejemplo
SUM OVER (ORDER BY)
.fuente
No estoy seguro de por qué quieres asíncrono, pero un par de vistas indexadas suena como el ticket aquí. Si desea un SUM simple para algún grupo que sea: defina el total acumulado.
Si realmente desea asincrónico, con 160 filas nuevas por segundo, sus totales acumulados siempre estarán desactualizados. Asíncrono significaría que no hay disparadores o vistas indexadas
fuente
Calcular los totales acumulados es notoriamente lento, ya sea que lo haga con un cursor o con una unión triangular. Es muy tentador desnormalizar, almacenar totales acumulados en una columna, especialmente si lo selecciona con frecuencia. Sin embargo, como es habitual cuando se desnormaliza, debe garantizar la integridad de sus datos desnormalizados. Afortunadamente, puede garantizar la integridad de los totales acumulados con restricciones: siempre y cuando todas sus restricciones sean confiables, todos sus totales correctos son correctos.
También de esta manera puede asegurarse fácilmente de que el saldo actual (totales acumulados) nunca sea negativo: la aplicación por otros métodos también puede ser muy lenta. El siguiente script demuestra la técnica.
Copiado de mi blog
fuente