我在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");
实际上并没有为查询性能做任何事情(我想因为我没有查询数组的内容)。
有没有办法让这项工作更快?
如果规范化数据并将数组元素存储在第二个表中,则会更快。然后你可以使用keyset pagination翻阅数据。