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?