在jsonb postgres中选择数组的子集

问题描述 投票:0回答:1

我在Postgres 9.6.3中有一张桌子:

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

在我的“Json”列中,我存储数组如下:

[
  {"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");实际上并没有为查询性能做任何事情(我想因为我没有查询数组的内容)。

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

postgresql
1个回答
1
投票

如果规范化数据并将数组元素存储在第二个表中,则会更快。然后你可以使用keyset pagination翻阅数据。

no OFFFSET!

© www.soinside.com 2019 - 2024. All rights reserved.