Mi sembra che se volessi memorizzare quelle informazioni in una tabella , dovresti aggiornare quella tabella ogni volta che si verifica una transazione. Oppure aggiorna a intervalli regolari.
Se hai usato una vista a tale scopo, puoi semplicemente interrogare la vista e la vista farebbe tutti i calcoli per te.
Poiché sembra che il volume del tuo sistema sia abbastanza pesante da paralizzare una query di aggregazione anche la tabella con l'indice migliore (e presumo che tu verificherai una o due volte, solo per vedere), avendo una tabella con i dati aggregati potrebbe essere meglio di interrogare costantemente la tabella di origine. Il problema che vedo è se ci sono così tante transazioni nel sistema, facendo un aggregato completo ogni volta che c'è una transazione probabilmente sarà un problema. Quindi ecco un'altra idea a cui pensavo: avere una tabella in cui si inseriscono i dati aggregati per una finestra temporale più piccola. Ad esempio, ogni 5 minuti (o ogni ora o ogni giorno) si esegue un lavoro che aggrega tutti i dati delle transazioni per gli ultimi 5 minuti. Quindi la query aggregata totale viene eseguita fuori da questa tabella. Lo svantaggio di questo approccio è che non hai statistiche in tempo reale, hai statistiche fino all'ultima aggregazione.
window_aggregates
-----------------
id
start_time
end_time
revenue
balance
tansaction_count
...
total_stats_view
----------------
select sum(revenue) as total_revenue, sum(balance) as total_balance, sum(transaction_count) as total_transaction_count
from window_aggregates
/*you could put a where clause here to specify values for start_time and end_time, if you want*/