postgresql regr_slope (Y, X): pendenza dell'equazione lineare di adattamento dei minimi quadrati determinata dalle coppie (X, Y)


Esempio

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.