2016-01-28 7 views
5

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?

Odpowiedz

0

Można wykonać dwie kwerendy: pierwsza otrzyma odpowiednie kontenery, uporządkowane i ograniczone do 25. Drugi dostanie treść content_item przy użyciu klauzuli where-in. Aplikacja może następnie filtrować i mapować zawartość do odpowiednich kontenerów.