Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql postgres中json_agg连接的查询性能_Sql_Postgresql_Performance_Query Performance_Postgresql Performance - Fatal编程技术网

Sql postgres中json_agg连接的查询性能

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

我有两张桌子

条目

id | val1 | val2 -------+------+------+ ent_1 | xxx | xxx ent_2 | xyy | yyy ent_3 | zxz | zzz ent_4 | zxz | zzz 由于所需的结果和结构,我决定使用Json\u aggJson\u build\u object查询如下

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)
上建立索引(显然,它可能是主键)