sql - 在 postgres 中使用 json_agg 查询性能

标签 sql postgresql performance query-performance postgresql-performance

我有两张 table

条目


 id    | val1 | val2
-------+------+------+
 ent_1 | xxx  | xxx
 ent_2 | xyy  | yyy
 ent_3 | zxz  | zzz
 ent_4 | zxz  | zzz

Table entries_list


 id  | entry_id | val1 | val2
-----+----------+------+-------
   1 |   ent_1  | xxx  | xxx
   2 |   ent_1  | xyy  | yyy
   3 |   ent_2  | zxz  | zzz
   4 |   ent_2  | zxz  | zzz

entries_list.entry_id is forigen key from entries.id

So I need to find the entries which have a corresponding entry_list references. I don't want the entries which doesn't have any reference in entry_list and the result I am expecting from this is

[{
    id: ent_1,
    entries: [{
        id: 1,
        val1: xxx,
        val2: xxx
    }, {
        id: 1,
        val1: xxx,
        val2: xxx
    }]
}, {
    id: ent_2,
    entries: [{
        id: 3,
        val1: xxx,
        val2: xxx
    }, {
        id: 4,
        val1: xxx,
        val2: xxx
    }]
}]

由于所需的结果和结构,我决定使用 Json_aggJson_build_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 

但是对于 1M 记录,它的表现非常糟糕,大约需要 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 ;

为了性能,您需要在 entries_list(entry_id, id, val2) 上建立索引。第一个键尤为重要。

关于sql - 在 postgres 中使用 json_agg 查询性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45461405/

相关文章:

php - 如何高效地使用 SQL 以半小时为间隔检索数据?

mysql - 简化 mySql 查询的形式

ruby-on-rails - 在 osx mavericks 上安装 postgres

sql - 有 3 个实体,根据其他 2 个实体的关系数(计数)得到第三个实体

python - 如何在 SQLAlchemy 中将 "ANY"过滤器与 "<<="运算符结合使用?

mysql - 需要帮助了解 mysql 索引的工作原理

sql - 带有正则表达式的 Postgresql 中的条件检查约束

mysql - 尝试理解联接

sql - SQL 中的重新映射/连接

java - Amazon DynamoDB 中的 MAX 操作