Nel libro Database Fundamentals, Silberschatz. Si spiega che le funzioni aggregate possono essere calcolate durante la marcia.
Questo ha senso. Ciò che significa è che per calcolare il massimo, calcolare la media o contare gli elementi di un set, non è necessario passare una copia del set alle procedure di aggregazione, si elabora solo ogni record nel frattempo si attraversa il set.
Un'implementazione ingenua potrebbe essere quella di mantenere una variabile per ogni aggregato desiderato. Ad esempio, un SELECT sum(a_field), count(a_field), max(a_field) FROM a_set
potrebbe essere implementato come:
sum_ = 0
count_ = 0
max_ = -INF
for record in a_set:
sum_ = sum_ + record.a_field
count_ = count_ + 1
max_ = max(max_, record.a_field)
return (sum_, count_, max_)
Ovviamente, questo è impensabile in quanto il loop sul set non dovrebbe essere così legato al calcolo aggregato. Suppongo che il ciclo deleghi l'aggregazione a una specie di coroutine.
Supponendo che una coroutine sia un tipo di oggetto con due metodi:
- feed: dove puoi passare un valore alla coroutine
- get: che ti dà il risultato di un calcolo
Il ciclo dovrebbe essere qualcosa del tipo:
# Given a set C of aggregation coroutines
for record in a_set:
for c in C:
c.feed(record.a_field)
return (c.get() for c in C)
In questo caso, immagino una coroutine come max
come:
max_ = -INF
while item = consume():
max_ = max(max_, item)
yield max_
Qui, suppongo che quando la coroutine invoca consume
, aspetta che qualcuno chiami il suo metodo feed
. E quando chiama yield
, quel valore viene raccolto successivamente da colui che invoca il suo metodo get
.
Solo per divertimento, implementiamo sum
:
sum_ = 0
while item = consume():
sum_ = sum_ + item
yield sum_
Quindi, questo è ampiamente quello che imagine sta accadendo dietro le quinte, ma non posso esserne sicuro, quindi:
- In che modo questo processo viene effettivamente implementato nella maggior parte dei motori SQL?.
- Che cosa accadrebbe con un'aggregazione che richiede due o più transversioni nel set di dati, come la deviazione standard?.
Nota: lo pseudo è una specie di pseudo Python.