postgresql
Funzioni aggregate
Ricerca…
Statistiche semplici: min (), max (), avg ()
Per determinare alcune statistiche semplici di un valore in una colonna di una tabella, è possibile utilizzare una funzione di aggregazione.
Se il tuo tavolo individuals
è:
Nome | Età |
---|---|
Allie | 17 |
Amanda | 14 |
Alana | 20 |
Puoi scrivere questa affermazione per ottenere il valore minimo, massimo e medio:
SELECT min(age), max(age), avg(age)
FROM individuals;
Risultato:
min | max | avg |
---|---|---|
14 | 20 | 17 |
string_agg (espressione, delimitatore)
È possibile concatenare stringhe separate da delimitatore utilizzando la funzione string_agg()
.
Se il tuo tavolo individuals
è:
Nome | Età | Nazione |
---|---|---|
Allie | 15 | Stati Uniti d'America |
Amanda | 14 | Stati Uniti d'America |
Alana | 20 | Russia |
È possibile scrivere SELECT ... GROUP BY
per ottenere i nomi da ciascun paese:
SELECT string_agg(name, ', ') AS names, country
FROM individuals
GROUP BY country;
Si noti che è necessario utilizzare una clausola GROUP BY
perché string_agg()
è una funzione di aggregazione.
Risultato:
nomi | nazione |
---|---|
Allie, Amanda | Stati Uniti d'America |
Alana | Russia |
Più funzioni di aggregazione di PostgreSQL descritte qui
regr_slope (Y, X): pendenza dell'equazione lineare di adattamento dei minimi quadrati determinata dalle coppie (X, Y)
Per illustrare come usare regr_slope (Y, X), l'ho applicato a un problema del mondo reale. In Java, se non si pulisce correttamente la memoria, la spazzatura può rimanere bloccata e riempire la memoria. Esegui il dump delle statistiche ogni ora sull'utilizzo della memoria di diverse classi e caricalo in un database postgres per l'analisi.
Tutti i candidati alla perdita di memoria avranno una tendenza a consumare più memoria man mano che passa più tempo. Se tracciate questa tendenza, immaginereste una linea che salirà verso sinistra:
^
|
s | Legend:
i | * - data point
z | -- - trend
e |
( |
b | *
y | --
t | --
e | * -- *
s | --
) | *-- *
| -- *
| -- *
--------------------------------------->
time
Supponiamo di avere una tabella contenente i dati dell'istogramma di heap dump (una mappatura delle classi sulla quantità di memoria che consumano):
CREATE TABLE heap_histogram (
-- when the heap histogram was taken
histwhen timestamp without time zone NOT NULL,
-- the object type bytes are referring to
-- ex: java.util.String
class character varying NOT NULL,
-- the size in bytes used by the above class
bytes integer NOT NULL
);
Per calcolare la pendenza per ogni classe, raggruppiamo per la classe. La clausola HAVING> 0 garantisce che riceviamo solo candidati con uno slop positivo (una linea che sale e si trova a sinistra). Selezioniamo la pendenza decrescente in modo da ottenere le classi con il più alto tasso di aumento della memoria nella parte superiore.
-- epoch returns seconds
SELECT class, REGR_SLOPE(bytes,extract(epoch from histwhen)) as slope
FROM public.heap_histogram
GROUP BY class
HAVING REGR_SLOPE(bytes,extract(epoch from histwhen)) > 0
ORDER BY slope DESC ;
Produzione:
class | slope
---------------------------+----------------------
java.util.ArrayList | 71.7993806279174
java.util.HashMap | 49.0324576155785
java.lang.String | 31.7770770326123
joe.schmoe.BusinessObject | 23.2036817108056
java.lang.ThreadLocal | 20.9013528767851
Dall'output vediamo che il consumo di memoria di java.util.ArrayList è in aumento il più veloce a 71.799 byte al secondo ed è potenzialmente parte della perdita di memoria.