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.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow