postgresql
Funkcje agregujące
Szukaj…
Proste statystyki: min (), max (), avg ()
Aby ustalić proste statystyki wartości w kolumnie tabeli, możesz użyć funkcji agregującej.
Jeśli individuals
tabela:
Nazwa | Wiek |
---|---|
Allie | 17 |
Amanda | 14 |
Alana | 20 |
Możesz napisać to oświadczenie, aby uzyskać minimalną, maksymalną i średnią wartość:
SELECT min(age), max(age), avg(age)
FROM individuals;
Wynik:
min | max | śr |
---|---|---|
14 | 20 | 17 |
string_agg (wyrażenie, separator)
Możesz łączyć łańcuchy rozdzielone separatorem za pomocą funkcji string_agg()
.
Jeśli individuals
tabela:
Nazwa | Wiek | Kraj |
---|---|---|
Allie | 15 | USA |
Amanda | 14 | USA |
Alana | 20 | Rosja |
Możesz napisać SELECT ... GROUP BY
, aby uzyskać nazwy z każdego kraju:
SELECT string_agg(name, ', ') AS names, country
FROM individuals
GROUP BY country;
Pamiętaj, że musisz użyć klauzuli GROUP BY
, ponieważ string_agg()
jest funkcją agregującą.
Wynik:
nazwy | kraj |
---|---|
Allie, Amanda | USA |
Alana | Rosja |
Więcej funkcji agregujących PostgreSQL opisanych tutaj
regr_slope (Y, X): nachylenie równania liniowego o najmniejszych kwadratach, określone przez pary (X, Y)
Aby zilustrować, jak używać regr_slope (Y, X), zastosowałem go do problemu w świecie rzeczywistym. W Javie, jeśli nie wyczyścisz poprawnie pamięci, śmieci mogą utknąć i wypełnić pamięć. Co godzinę zrzucasz statystyki dotyczące wykorzystania pamięci przez różne klasy i ładujesz je do bazy danych Postgres w celu analizy.
Wszyscy kandydaci na wyciek pamięci będą mieli tendencję do zużywania większej ilości pamięci w miarę upływu czasu. Jeśli wykreślisz ten trend, wyobraź sobie linię idącą w górę i w lewo:
^
|
s | Legend:
i | * - data point
z | -- - trend
e |
( |
b | *
y | --
t | --
e | * -- *
s | --
) | *-- *
| -- *
| -- *
--------------------------------------->
time
Załóżmy, że masz tabelę zawierającą dane histogramu zrzutu stosu (odwzorowanie klas na zużycie pamięci):
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
);
Aby obliczyć nachylenie dla każdej klasy, grupujemy według klas. Klauzula HAVING> 0 zapewnia, że otrzymujemy tylko kandydatów z dodatnim nachyleniem (linia w górę i w lewo). Sortujemy według nachylenia malejącego, aby uzyskać klasy o największym tempie wzrostu pamięci na górze.
-- 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 ;
Wynik:
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
Z danych wyjściowych wynika, że zużycie pamięci java.util.ArrayList rośnie najszybciej (71,799 bajtów na sekundę) i potencjalnie jest częścią wycieku pamięci.