Próbuję zrozumieć znaczne różnice prędkości, które widzę między podobnymi zapytaniami DB, i miałem nadzieję na wgląd w to, dlaczego niektóre agregacje są wolniejsze od innych.Zrozumienie wydajności json_agg w PostgreSQL 9.5
zauważyłem pewne problemy z szybkością, z prostego zapytania odzyskiwania dokumentów, a znaczna część z nich wydaje się być json_agg
funkcja:
SELECT containers.*, json_agg(content_items.*) as items FROM containers
INNER JOIN content_items ON containers.id = content_items.container_id
GROUP BY containers.id
ORDER BY containers.order_date DESC, containers.id DESC
LIMIT 25 OFFSET 0;
Pokazuje całkowity czas zapytań o około 500ms, z ponad 400ms tego spędził w etapie agregacji:
GroupAggregate (cost=11921.58..12607.34 rows=17540 width=1553) (actual time=78.818..484.071 rows=17455 loops=1)
przełączając json_agg
do array_agg
przynosi całkowity czas w dół w zakresie 150ms, choć o połowę czasu wciąż spędził agregowania:
GroupAggregate (cost=11921.58..12607.34 rows=17540 width=1553) (actual time=81.975..147.207 rows=17455 loops=1)
Wykonywanie kwerendy bez grupowania lub agregacja przynosi całkowity czas w dół do 25ms, mimo że wróci zmienną liczbę containers
w zależności od tego, ile content_items
były w każdym.
Czy jest jakiś powód, aby json_agg
nałożyć taką karę? Czy istnieje skuteczny sposób pobierania ustawionej liczby wierszy container
wraz z ich wszystkimi content_items
i po prostu agregować w warstwie aplikacji?