我在Postgresql 9.6上工作, 我在这里尝试代表Json键从表中获取数据,这是jsonb类型, 数据看起来像是
[{"name": "gp1", "type": "A"}, {"name": "gp2", "type": "A"}, {"name": "gp2", "type": "A"}]
这里的模块是column_name,client_modules是表名。
我也使用以下查询
创建索引create index myindex on client_modules((modules->>'name'));
问题是当我尝试使用以下查询从表中获取数据时
SELECT modules FROM client_modules WHERE modules @>'[{"name":"gp1"}]' or modules @> '{"name":"gp1"}';
我能够检索所需的数据,但在这种情况下,我的plpgsql查询在默认的seqscan索引上运行,
我也执行脚本
set enable_indexscan = on;
AND
set enable_seqscan = off;
但仍然在我的索引上运行查询,当我运行查询时它仍然在默认索引上运行。
答案 0 :(得分:0)
对于PostgreSQL表达式索引,索引条件和过滤条件必须完全匹配。你的不匹配。你编入索引:
modules->>'name'
然后你搜索了:
modules @>'[{"name":"gp1"}]'
虽然您知道并且我知道这两个搜索在功能上是等效的,但PostgreSQL查询规划器并不知道它。所以你有两个选择:
CREATE INDEX jsonb_all ON client_modules USING GIN (modules);