了解Postgres 9.5中的json_agg性能

时间:2016-01-28 14:49:15

标签: performance postgresql

我试图理解我在类似数据库查询之间看到的实质性速度差异,并且我希望能够深入了解为什么某些聚合比其他聚合慢得多。

我注意到一个简单的文档检索查询有一些速度问题,其中很大一部分似乎是json_agg函数:

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;

显示总查询时间约为500毫秒,在聚合步骤中花费的时间超过400毫秒:

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

只需将json_agg切换为array_agg,即可将总时间缩短至150毫秒范围内,但大约有一半的时间仍用于汇总:

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

执行不进行分组或聚合的查询会将总时间缩短至25毫秒,但会返回containers的可变数量,具体取决于每个content_items的数量。{/ p>

json_agg是否有理由施加此类处罚?是否有一种高效的方法可以检索一定数量的container行及其所有content_items行,并简单地在应用程序层中进行聚合?

1 个答案:

答案 0 :(得分:0)

你可以做两个查询:第一个获得适当的容器,有序并限制为25.第二个将使用where-in子句获取content_items。然后,应用程序可以过滤内容并将其映射到适当的容器中。