Eu tenho uma tabela base com transações e preciso criar uma tabela com totais em execução. Eu preciso que eles sejam por conta e também tenham alguns totais em execução para cada conta (dependendo do tipo de transação) e, dentro disso, alguns totais em execução por subconta.
Minha tabela base possui estes campos (mais ou menos):
AccountID | SubAccountID | TransactionType | TransactionAmount
Considerando que eu tenho cerca de 4 tipos de totais em execução por Account / TransactionType e mais 2 totais em execução por Account / SubAccount / TransactionType, e eu tenho cerca de 2 milhões de contas com cerca de 10 subcontas cada e estou recebendo cerca de 10 mil transações a cada minuto (com carga máxima), como você faria isso?
Também é necessário que isso seja executado de forma assíncrona por meio de um trabalho SQL, criando as agregações sem fazer parte das próprias transações.
Estou bem preso usando um cursor aqui - o que leva muito tempo. Eu realmente aprecio qualquer conselho / artigo que esteja fazendo mais ou menos o mesmo.
fonte
Respostas:
Assíncrono implica que os totais em execução não precisam ser completamente precisos o tempo todo, ou seus padrões de alteração de dados são tais que uma construção total em execução única será válida e precisa até o próximo carregamento. De qualquer forma, tenho certeza que você já pensou nessa parte, então não vou insistir nisso.
Suas principais opções para um método suportado de alto desempenho são uma função / procedimento do SQLCLR ou um
UPDATE
método de iteração baseado em conjunto de Hugo Kornelis. O método SQLCLR (implementado em um procedimento, mas razoavelmente fácil de traduzir) pode ser encontrado aqui .Não consegui encontrar o método de Hugo online, mas ele está detalhado no excelente MVP Deep Dives (Volume 1). Um código de exemplo para ilustrar o método de Hugo (copiado de uma das minhas postagens em outro site para o qual você talvez não tenha um login) é mostrado abaixo:
No SQL Server 2012, você pode usar as extensões das funções de janelas, por exemplo
SUM OVER (ORDER BY)
.fonte
Não sei por que você deseja assíncrono, mas algumas exibições indexadas parecem apenas o ticket aqui. Se você deseja um SUM simples para algum grupo: defina o total em execução.
Se você realmente deseja assíncrono, com 160 novas linhas por segundo, seus totais em execução estarão sempre desatualizados. Assíncrono não significaria gatilhos ou exibições indexadas
fonte
O cálculo dos totais em execução é notoriamente lento, seja com um cursor ou com uma junção triangular. É muito tentador desnormalizar, armazenar totais em execução em uma coluna, especialmente se você a selecionar com frequência. No entanto, como sempre, quando você desnormaliza, precisa garantir a integridade de seus dados desnormalizados. Felizmente, você pode garantir a integridade dos totais em execução com restrições - desde que todas as suas restrições sejam confiáveis, todos os totais em execução estejam corretos.
Dessa forma, você pode facilmente garantir que o saldo atual (totais em execução) nunca seja negativo - a imposição de outros métodos também pode ser muito lenta. O script a seguir demonstra a técnica.
Copiado do meu blog
fonte