gpt4 book ai didi

arrays - 在 Postgres 中索引一个 jsonb 数组

转载 作者:行者123 更新时间:2023-11-29 11:35:46 25 4
gpt4 key购买 nike

<分区>

我尝试设置一个 GIN 索引,但我不认为我的索引在我运行请求时被使用,无论我使用运算符还是函数。

环境

在我们的表中,我们有一个 JSONB 字段 (json_aip),其中包含一个如下所示的 Json:

{
"properties": {
"pdi": {
"contextInformation": {
"tags": ["SOME_TAG"]
},
},
}

创建表:

create table t_aip (
json_aip jsonb,
[...]
);

CREATE INDEX idx_aip_tags
ON t_aip
USING gin ((json_aip -> 'properties' -> 'pdi' -> 'contextInformation' -> 'tags'));

运营商查询

我们不能像使用 JDBC 那样使用运算符 ?|。但谣言表明,当我运行那种类型的查询时,我应该会看到我的索引。

EXPLAIN ANALYZE SELECT count(*)  
FROM storage.t_aip
WHERE json_aip#>'{properties,pdi,contextInformation,tags}' ?| array['SOME_TAG']

结果:

  Aggregate

(cost=27052.16..27052.17 rows=1 width=8) (actual time=488.085..488.087 rows=1 loops=1)
-> Seq Scan on t_aip (cost=0.00..27052.06 rows=42 width=0) (actual time=0.134..456.978 rows=16502 loops=1)
Filter: ((json_aip #> '{properties,pdi,contextInformation,tags}'::text[]) ?| '{SOME_TAG}'::text[])
Rows Removed by Filter: 17511
Planning time: 23.202 ms
Execution

time: 488.449 ms

函数查询

EXPLAIN ANALYZE SELECT count(*)  
FROM storage.t_aip
WHERE jsonb_exists_any(
json_aip#>'{properties,pdi,contextInformation,tags}',
array['SOME_TAG']
)

结果:

QUERY PLAN
Aggregate (cost=27087.00..27087.01 rows=1 width=8) (actual time=369.931..369.933 rows=1 loops=1)
-> Seq Scan on t_aip (cost=0.00..27052.06 rows=13979 width=0) (actual time=0.173..350.437 rows=16502 loops=1)
Filter: jsonb_exists_any((json_aip #> '{properties,pdi,contextInformation,tags}'::text[]), '{SOME_TAG}'::text[])
Rows Removed by Filter: 17511
Planning time: 56.021 ms
Execution time: 370.252 ms

根本没有关于索引的信息。任何帮助将非常感激 !

我认为我的索引是错误的,因为它认为在路径的末尾 json_aip -> 'properties' -> 'pdi' -> 'contextInformation' -> 'tags' 它索引了一个字符串是否是一个数组。这是我的看法。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com