Ami*_*ubi 5 postgresql indexing jsonb
我正在使用 PostgreSQL。有没有办法只在字典键而不是值上创建索引 。
例如,想象一个 jsonb 列,如下所示:
select data from tablename where id = 0;
answer: {1:'v1', 2:'v2'}
Run Code Online (Sandbox Code Playgroud)
我想在键集(或键列表)上建立索引,该键集是[1, 2]. 为了加快查询速度,例如:
select count(*) from tablename where data ? '2';
Run Code Online (Sandbox Code Playgroud)
正如您在docs中看到的,有一种方法可以对列进行完全索引(键+值):
CREATE INDEX idxgin ON api USING GIN (jdoc);
Run Code Online (Sandbox Code Playgroud)
考虑到我在值中存储了大量数据,这对我来说不好。
我之前尝试过这个:
CREATE INDEX test ON tablename (jsonb_object_keys(data));
Run Code Online (Sandbox Code Playgroud)
错误是:
ERROR: set-returning functions are not allowed in index expressions
Run Code Online (Sandbox Code Playgroud)
另外,我不想将键作为值存储在字典中。
你能帮助我吗?
您的示例没有多大意义,因为您的 WHERE 子句未指定 JSON 操作,并且您的示例输出不是有效的 JSON 语法。
您可以将返回集合的函数(和聚合)隐藏到 IMMUTABLE 函数中:
create function object_keys(jsonb) returns text[] language SQL immutable as $$
select array_agg(jsonb_object_keys) from jsonb_object_keys($1)
$$;
create index on tablename using gin ( object_keys(data));
Run Code Online (Sandbox Code Playgroud)
如果您这样做,您可以像这样查询它:
select * from tablename where object_keys(data) @> ARRAY['2'];
Run Code Online (Sandbox Code Playgroud)
如果您希望以这种方式查询,您可以让该函数返回包含数组的 JSONB,而不是返回 PostgreSQL 文本数组:
select * from tablename where object_keys_jsonb(data) @> '"2"';
Run Code Online (Sandbox Code Playgroud)
您不能使用?公式,因为在 JSONB 中,它专门用于对象而不是数组。如果您确实想使用?,您可以编写一个函数,将对象保留为对象,但将所有值转换为 JSON null 或空字符串,因此它们占用更少的空间。
| 归档时间: |
|
| 查看次数: |
3148 次 |
| 最近记录: |