sql - 使用 Postgres 在 json 数组中索引对象元素

标签 sql arrays json postgresql

我有一个 9.4 Postgres 数据库,其中有一个包含 jsonb 的表。字段。

json 的结构类似于:

{
  name: 'customer1',
  age: 28,
  products: [{
    name: 'product1',
    price: 100
  }, {
    name: 'product2',
    price: 200
  }]
}

以下查询可以正常返回上述 json:

SELECT jdoc
FROM customers, jsonb_array_elements(jdoc->'products') as products
WHERE (products->>'price')::numeric > 150

问题是在较大的数据库上性能会受到很大影响。

我可以使用什么索引来加速此查询?


到目前为止我已经尝试过:

  • GIN索引( jsonb_opsjsonb_path_ops )。它们似乎只适用于像 @> 这样的存在运算符。不过。

  • CREATE INDEX ON persons(((jsonb_array_elements(jdoc->'products')->>'price')::numeric)) 。这给了我数据类型不匹配错误。

    • 请注意CREATE INDEX ON persons(((jdoc->'age')::numeric))有效并允许我查询 (jdoc->>'age')::numeric < 30快。

最佳答案

您可以创建一个函数并使用它:

CREATE FUNCTION max_price(jsonb) RETURNS double precision
   LANGUAGE sql IMMUTABLE AS
$$SELECT max(p.price)
FROM jsonb_to_recordset($1->'products')
        AS p(name text, price double precision)$$;

CREATE INDEX customers_ind ON customers(max_price(jdoc));

然后这个索引可以与这样的查询一起使用:

EXPLAIN SELECT jdoc FROM customers WHERE max_price(jdoc) > 150;

                                   QUERY PLAN
--------------------------------------------------------------------------------
 Index Scan using customers_ind on customers  (cost=0.12..8.14 rows=1 width=36)
   Index Cond: (max_price(jdoc) > '150'::double precision)
(2 rows)

这不是您的查询,但它应该是等效的。

关于sql - 使用 Postgres 在 json 数组中索引对象元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41165077/

相关文章:

sql - 图表工具在 SQL Server 2008 R2 中停止工作

mysql - 只执行 SELECT 语句 IF something

javascript - Angular2 Typescript如何从对象内部检索数组

php - 使用 PHP 调试数组的最佳方法

PHP 隐藏/显示带分页的图像

json - 配置JsonProcessingExceptionMapper登录Dropwizard

javascript - 如何设置加载 JSON 层的最小缩放?

php - 同步 MySQL 和 PHP 时间

sql - MS ACCESS 2016 多重联接语法

C指向结构中二维数组的指针