Gre*_*reg 5 postgresql performance
我试图理解我在类似数据库查询之间看到的实质性速度差异,我希望能够深入了解为什么某些聚合比其他聚合慢得多.
我注意到一个简单的文档检索查询有一些速度问题,其中很大一部分似乎是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;
Run Code Online (Sandbox Code Playgroud)
显示总查询时间约为500毫秒,在聚合步骤中花费的时间超过400毫秒:
GroupAggregate (cost=11921.58..12607.34 rows=17540 width=1553) (actual time=78.818..484.071 rows=17455 loops=1)
Run Code Online (Sandbox Code Playgroud)
简单地切换json_agg
到array_agg
将总时间缩短到150ms范围内,尽管大约一半的时间仍用于聚合:
GroupAggregate (cost=11921.58..12607.34 rows=17540 width=1553) (actual time=81.975..147.207 rows=17455 loops=1)
Run Code Online (Sandbox Code Playgroud)
在没有分组或聚合的情况下执行查询会将总时间缩短到25毫秒,尽管这会返回一个可变数量,containers
具体取决于content_items
每个中的数量.
是否有理由json_agg
实施这样的处罚?是否有一种高效的方法来检索一定数量的container
行,以及它们的所有行content_items
,并简单地在应用程序层中聚合?
您可以执行两个查询:第一个查询将获取适当的容器,已排序且限制为 25 个。第二个查询将使用 where-in 子句获取 content_items。然后,应用程序可以过滤内容并将其映射到适当的容器中。
归档时间: |
|
查看次数: |
862 次 |
最近记录: |