Sql postgres中json_agg连接的查询性能
我有两张桌子 表条目 id | val1 | val2 -------+------+------+ ent_1 | xxx | xxx ent_2 | xyy | yyy ent_3 | zxz | zzz ent_4 | zxz | zzz 由于所需的结果和结构,我决定使用Json\u agg和Json\u build\u object查询如下Sql postgres中json_agg连接的查询性能,sql,postgresql,performance,query-performance,postgresql-performance,Sql,Postgresql,Performance,Query Performance,Postgresql Performance,我有两张桌子 表条目 id | val1 | val2 -------+------+------+ ent_1 | xxx | xxx ent_2 | xyy | yyy ent_3 | zxz | zzz ent_4 | zxz | zzz 由于所需的结果和结构,我决定使用Json\u agg和Json\u build\u object查询如下 SELECT entries.id, Json_agg(Json_build_object('id', lis
SELECT entries.id,
Json_agg(Json_build_object('id', list.id, 'val1', list.val2, 'val2',
list.val2)) AS sub_list
FROM entries
INNER JOIN (SELECT id,val1,val2
FROM entries_list) AS list
ON entries.id = list.entry_id
GROUP BY entries.id
ORDER BY entries.id
但它的表现非常糟糕,对于100万条记录来说,它几乎只有10秒。那么,有什么更好的方法来改变这一点呢
我考虑以计划的方式获取数据,并在sql之外的代码中对其进行分组,但在这两种方法中都应该如何修改查询
我有
nodejs
后端和pg
模块作为连接器。这个版本的性能如何
SELECT e.id,
(SELECT Json_agg(Json_build_object('id', el.id, 'val1', el.val2, 'val2',
el.val2))
FROM entries_list el
WHERE el.entry_id = e.id
) as sub_list
FROM entries e
ORDER BY e.id ;
为了提高性能,您需要在
条目列表(条目id,id,val2)
上建立索引。第一个键特别重要。此版本的性能如何
SELECT e.id,
(SELECT Json_agg(Json_build_object('id', el.id, 'val1', el.val2, 'val2',
el.val2))
FROM entries_list el
WHERE el.entry_id = e.id
) as sub_list
FROM entries e
ORDER BY e.id ;
为了提高性能,您需要在
条目列表(条目id,id,val2)
上建立索引。第一个键特别重要。您可以使用exists
代替常规连接:
select
entry_id,
json_agg(json_build_object('id', id, 'val1', val2, 'val2', val2)) as sub_list
from entries_list
where exists (
select 1
from entries e
where entry_id = e.id)
group by entry_id
order by entry_id;
您需要在
entries\u list(entry\u id)
上建立索引,在entries(id)
上建立索引(很明显,它可能是主键)您可以使用exists
代替常规连接:
select
entry_id,
json_agg(json_build_object('id', id, 'val1', val2, 'val2', val2)) as sub_list
from entries_list
where exists (
select 1
from entries e
where entry_id = e.id)
group by entry_id
order by entry_id;
您需要在entries\u list(entry\u id)
和entries(id)
上建立索引(显然,它可能是主键)