如何索引 JSONB 字段中数组内的对象?
How to index objects inside array in JSONB field?
我想 index
JSONB
字段 GIN
索引。在这个字段中,我有一个 array
的 objects
。准确地说,它看起来是这样的(用三个点缩短了第二个 object
):
[
{
"tags": ["student work", "fast apply"],
"intensity": [
{
"shift": "fulltime",
"period": "hours",
"duration": "9"
},
{
"shift": "parttime",
"period": "hours",
"duration": "4"
}
]
},
{ ... }
]
这就是我在 WHERE
子句中过滤此 table 的方式:
items.intensity @? '$[*] ? (@.tags == "student work" || @.tags == "undefined" || @.tags.size() == 0) ? (@.intensity[*].shift == "fulltime")'
这是我试过但没有用的索引:
CREATE INDEX idxginintensitytags ON items USING GIN (intensity jsonb_path_ops);
解释分析:
# Node Rows Loops
Actual
1. Bitmap Heap Scan on items as items (rows=154922 loops=1)
Recheck Cond: (intensity @? '$[*]?(@."intensity"[*]."shift" == "fulltime")'::jsonpath)
Heap Blocks: exact=33478
154922 1
2. Bitmap Index Scan using idxginintensitytags (rows=154922 loops=1)
Index Cond: (intensity @? '$[*]?(@."intensity"[*]."shift" == "fulltime")'::jsonpath)
154922 1
我想按 tags
、shifts
、periods
和 durations
过滤我的 table
。 table
.
我有 200,000 rows
我怎样才能index
这个field
?
我使用的是最新版本 - PostgreSQL 13
。
在我手中,一个问题是它确实使用了索引,尽管这样做速度较慢。原因是 @.tags.size() == 0
不能由索引确定,所以它最终返回所有 table 行进行重新检查,但计划者显然没有意识到会发生这种情况。
你能用不同的方式表达这个概念吗?
我想 index
JSONB
字段 GIN
索引。在这个字段中,我有一个 array
的 objects
。准确地说,它看起来是这样的(用三个点缩短了第二个 object
):
[
{
"tags": ["student work", "fast apply"],
"intensity": [
{
"shift": "fulltime",
"period": "hours",
"duration": "9"
},
{
"shift": "parttime",
"period": "hours",
"duration": "4"
}
]
},
{ ... }
]
这就是我在 WHERE
子句中过滤此 table 的方式:
items.intensity @? '$[*] ? (@.tags == "student work" || @.tags == "undefined" || @.tags.size() == 0) ? (@.intensity[*].shift == "fulltime")'
这是我试过但没有用的索引:
CREATE INDEX idxginintensitytags ON items USING GIN (intensity jsonb_path_ops);
解释分析:
# Node Rows Loops
Actual
1. Bitmap Heap Scan on items as items (rows=154922 loops=1)
Recheck Cond: (intensity @? '$[*]?(@."intensity"[*]."shift" == "fulltime")'::jsonpath)
Heap Blocks: exact=33478
154922 1
2. Bitmap Index Scan using idxginintensitytags (rows=154922 loops=1)
Index Cond: (intensity @? '$[*]?(@."intensity"[*]."shift" == "fulltime")'::jsonpath)
154922 1
我想按 tags
、shifts
、periods
和 durations
过滤我的 table
。 table
.
rows
我怎样才能index
这个field
?
我使用的是最新版本 - PostgreSQL 13
。
在我手中,一个问题是它确实使用了索引,尽管这样做速度较慢。原因是 @.tags.size() == 0
不能由索引确定,所以它最终返回所有 table 行进行重新检查,但计划者显然没有意识到会发生这种情况。
你能用不同的方式表达这个概念吗?