2016-01-28 11 views
5

Ich versuche, wesentliche Geschwindigkeitsunterschiede zu verstehen, die ich zwischen ähnlichen DB-Abfragen sehe, und hoffte auf einige Einblicke, warum bestimmte Aggregationen so viel langsamer sind als andere.Verstehen der json_agg-Leistung in Postgres 9.5

bemerkte ich einige Geschwindigkeitsprobleme mit einer einfachen Dokument Suchabfrage, und ein wesentlicher Teil davon wird die json_agg Funktion sein:

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; 

Zeigt eine Gesamtabfragezeit von ca. 500 ms, mit mehr als 400 ms davon in dem Aggregationsschritt ausgegeben:

GroupAggregate (cost=11921.58..12607.34 rows=17540 width=1553) (actual time=78.818..484.071 rows=17455 loops=1) 

einfach json_agg zu array_agg Schalten die Gesamtzeit, nach unten in den Bereich 150 ms bringen, obwohl etwa die Hälfte der Zeit noch aggregieren ausgegeben wird:

GroupAggregate (cost=11921.58..12607.34 rows=17540 width=1553) (actual time=81.975..147.207 rows=17455 loops=1) 

Durchführung der Abfrage, ohne nach unten bringt die Gesamtzeit Gruppierung oder Aggregation zu 25ms, obwohl das eine variable Anzahl von containers je nachdem, wie viele content_items in jeder waren zurückkehren würde.

Gibt es einen Grund für die json_agg, eine solche Strafe aufzuerlegen? Gibt es eine performante Möglichkeit, eine festgelegte Anzahl von container Zeilen zusammen mit all ihren content_items zu erhalten und einfach in der Anwendungsschicht zu aggregieren?

Antwort

0

Sie könnten zwei Abfragen ausführen: Die erste würde die entsprechenden Container erhalten, geordnet und auf 25 begrenzt. Die zweite würde die content_items mit einer where-in-Klausel erhalten. Die Anwendung könnte dann den Inhalt filtern und in die entsprechenden Container abbilden.

Verwandte Themen