目前,我正在对一个有800多万行的JSONB表编写查询。如何以最有效的方式查询parent和friends对象?查询(Postgres 9.6):select distinct id, data->>'_id' jsonID, data->>'email' email, friends->>'name' friend_name, parent->>'name' parentfrom temp tCROSS JOIN jsonb_array_elements(t.data->'friends') friendsCROSS JOIN jsonb_array_elements(friends->'parent') parentwhere friends ->> 'name' = 'Chan Franco'and parent->>'name' = 'Hannah Golden'示例DDL(带数据):https://pastebin.com/byN7uyKx 最佳答案 作为规范化的关系设计,您的定期结构化数据将更干净、更小和更快。也就是说,要使设置速度更快(如果不如具有匹配索引的规范化设计快),请在表达式上添加GIN索引: CREATE INDEX tbl_data_friends_gin_idx ON tbl USING gin ((data->'friends'));然后使用contains运算符将匹配的data->'friends'子句添加到查询中:SELECT DISTINCT -- why DISTINCT ? id, data->>'_id' AS json_id, data->>'email' AS email , friends->>'name' AS friend_name, parent->>'name' AS parentFROM tbl tCROSS JOIN jsonb_array_elements(t.data->'friends') friendsCROSS JOIN jsonb_array_elements(friends->'parent') parentWHERE t.data->'friends' @> '[{"name": "Chan Franco", "parent": [{"name": "Hannah Golden"}]}]'AND friends->>'name' = 'Chan Franco'AND parent ->>'name' = 'Hannah Golden';分贝小提琴here最大的区别是:在索引的帮助下,Postgres现在可以在取消对整个表中每个嵌套的“friends”数组的测试之前识别匹配的行。只有在标识了基础表中的匹配行之后,才会调用WHERE,并保留具有限定数组元素的结果行。注意,搜索表达式必须是有效的JSON,与JSON数组的结构相匹配,包括外括号。但是省略所有不应该用作过滤器的键/值对。相关:Index for finding an element in a JSON array我避免使用表名@>,因为这是一个SQL关键字,可能会导致混淆错误。改为使用名称jsonb_array_elements()。关于arrays - 查询嵌套在JSON数组中的数据的最有效方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53178999/
10-13 01:49