Do Database Ottimizza le query con Somma / Media o Altri aggregati?

3

Immagina un database che ha miliardi di righe con, diciamo, pagamenti. Devi calcolare una somma di pagamento media. Quello sarà

SELECT avg(amount) FROM payments;

Ora, se hai bisogno di ricalcolare questa cifra ogni giorno, eseguire questa formula sull'intero set di dati è eccessivo.

Le biciclette hanno tachimetri che calcolano ogni secondo la velocità media e la cadenza media (pedale RPM), anche se non mantengono la velocità per ogni secondo, e puoi guidare ore, giorni e mesi senza azzerare il contatore medio.

Questo è fatto in un modo semplice: il tachimetro mantiene il valore medio e il numero di secondi. Quindi quando aggiungi un nuovo elemento alla somma, lo fa semplicemente:

new_average = (current_speed + old_average * count) / (count + 1)

Se conosci la matematica, è chiaro che qualsiasi somma o prodotto può essere calcolato in modo incrementale. Anche gli aggiornamenti possono essere eseguiti allo stesso modo: sottrarre il vecchio valore dall'aggregato, aggiungere il nuovo valore.

Voglio sapere se qualche database può farlo per il programmatore?

Capisco che la query nel DB possa essere diversa e avere criteri:

SELECT avg(amount) FROM payments WHERE condition_1 AND condition_2;

Tuttavia, è possibile memorizzare medie con più informazioni (quali righe erano nella sequenza e qual era la condizione di filtro).

È fatto ovunque?

    
posta culebrón 07.03.2012 - 12:07
fonte

2 risposte

3

I want to know if any database can do this for the programmer?

Ciò di cui hai bisogno è un database che supporti i trigger, quasi tutti i database relazionali "seri" lo supportano. Quindi è possibile scrivere una stored procedure che esegue automaticamente i calcoli necessari su qualsiasi inserto, eliminare e aggiornare alla tabella di pagamento. Avrai anche bisogno di una tabella aggiuntiva (ad esempio, una tabella payment_aggregates ), per contenere i risultati del calcolo. E se vuoi fare alcuni aggregati per limitare i criteri, devi conoscere in anticipo i criteri. Dovrai fornire un record nella tabella payment_aggregates per ogni sottoinsieme potenziale di payment definito dai tuoi criteri.

Se hai bisogno che ciò avvenga in un modo più generale, dovresti dare un'occhiata al modo in cui OLAP i database sono progettati. Questi database sono ottimizzati per consentire query veloci per aggregati su enormi set di dati.

    
risposta data 07.03.2012 - 17:55
fonte
2

Denormalizzazione del DB potrebbe essere usato in questa istanza.

In altre parole, per ogni nuovo inserimento di un pagamento, si aggiorna il valore totale del monitoraggio dei pagamenti.

Questa non è comunque una funzione incorporata.

    
risposta data 07.03.2012 - 12:34
fonte

Leggi altre domande sui tag