在jsonb postgres中选择数组的子集

时间:2017-12-21 23:06:08

标签: postgresql

我在Postgres 9.6.3中有一张表:

CREATE TABLE public."Records"
(
    "Id" uuid NOT NULL,
    "Json" jsonb,
    CONSTRAINT "PK_Records" PRIMARY KEY ("Id")
)

在我的" Json"列i存储数组如下:

[
  {"a":"b0","c":0,"z":true}, 
  {"a":"b1","c":1,"z":false},  
  {"a":"b2","c":2,"z":true}
]

每个阵列中可以有大约1000万条记录,表格中可以有大约500万条记录。

我希望将JSON输出,分页,例如跳过1条记录并返回2条记录。

我可以这样做:

select string_agg(txt, ',') as x FROM 
(select jsonb_array_elements_text("Json") as txt 
FROM "Records" where "Id" = 'de70aadc-70e8-4c77-bd4b-af75ed36897e' -- some id here
limit 50 offset 5000 -- paging parameters
) s;

但是,查询需要几秒钟(在780到900毫秒之间)才能在我的开发笔记本电脑上运行一些相当不错的硬件(macbook pro 2017)。注意:时间是针对上面指定的数据大小,当然3个记录的样本数据返回得更快。

像这样添加GIN索引:CREATE INDEX records_gin ON "Records" USING gin ("Json");实际上没有为查询性能做任何事情(我想因为我没有查询数组的内容)。

有没有办法让这项工作更快?

1 个答案:

答案 0 :(得分:1)

如果您规范化数据并将数组元素存储在第二个表中,那么速度会更快。然后,您可以使用keyset pagination来浏览数据。

no OFFFSET!