Postgresql 如何索引Postgres jsonb数据中的选择键?
我在Postgres中使用jsonb类型来存储键值文档。我在这些文档上使用GIN索引进行快速查找。尽管默认情况下GIN索引往往是冗长的,也就是说,它们对jsonb结构中的每个键都进行索引,但所有这些都可以正常工作。我想有更多的选择性索引 是否可以使用GIN索引执行这些操作Postgresql 如何索引Postgres jsonb数据中的选择键?,postgresql,Postgresql,我在Postgres中使用jsonb类型来存储键值文档。我在这些文档上使用GIN索引进行快速查找。尽管默认情况下GIN索引往往是冗长的,也就是说,它们对jsonb结构中的每个键都进行索引,但所有这些都可以正常工作。我想有更多的选择性索引 是否可以使用GIN索引执行这些操作 让GIN只索引顶级键,而不索引嵌套结构?或 只有GIN索引特定的关键字(我知道我可以为每个需要索引的关键字创建单独的btree索引。我想知道我是否可以通过GIN完成) 谢谢。可以使用辅助函数来完成,该函数将JSONB文档作为输
谢谢。可以使用辅助函数来完成,该函数将JSONB文档作为输入和键数组,并返回一个新文档,其中键已过滤,然后您可以使用GIN索引:
create function jsonb_filter(doc jsonb, variadic keys text[])
returns jsonb
as 'select jsonb_object_agg(key, doc->key) from unnest(keys) key'
language sql
immutable;
create index filtered_index on jsonb_table
using gin (jsonb_filter(data, 'a', 'b'));
select data->'a'
from jsonb_table
where jsonb_filter(data, 'a', 'b') @> '{"a":1}';
您可能希望在函数内部对要筛选的键集进行硬编码,以避免在查询中重复这些键
如果只想对某些键的存在进行索引,则:
create function jsonb_keys(doc jsonb)
returns text[]
as 'select array_agg(key) from jsonb_object_keys(doc) key'
language sql
immutable;
create index keys_index on jsonb_table
using gin (jsonb_keys(data));
select data->'b'
FROM jsonb_table
where jsonb_keys(data) @> ARRAY['a'];
可以修改函数jsonb_keys
,使其仅包含要索引的键
下面是相关的SQLFIDLE是否向FIDLE添加更多数据?那么它将开始使用yoiur索引?否则演示将不起作用:)@VaoTsun有效点,但使索引符合条件的关键是在查询筛选器中使用索引表达式:)