我正在尝试索引包含对象数组的JSONB列:
create table tmp_t (a INTEGER PRIMARY KEY,o jsonb);
insert into tmp_t (a,o) values(1, '[{"frame": 1, "accession": "NM_001184642.1"}]');
insert into tmp_t (a,o) values (2, '[{"frame": 3, "accession": "NM_001178208.1"}]');
CREATE INDEX idx_tmp_t ON tmp_t USING gin (o);
EXPLAIN告诉我以下查询不使用索引:
EXPLAIN
SELECT * from tmp_t v where v.o @> '[{"accession": "NM_001178208.1"}]';
解释结果:
QUERY PLAN
Seq Scan on tmp_t v (cost=0.00..1.02 rows=1 width=36)
Filter: (o @> '[{""accession"": ""NM_001178208.1""}]'::jsonb)
我的设置似乎与回答此问题时的设置相同:
Using indexes in json array in PostgreSQL
我在问题中创建了示例表,并且使用了索引 :
"QUERY PLAN"
"Bitmap Heap Scan on tracks (cost=16.01..20.02 rows=1 width=36)"
" Recheck Cond: (artists @> '[{""z"": 2}]'::jsonb)"
" -> Bitmap Index Scan on tracks_artists_gin_idx (cost=0.00..16.01 rows=1 width=0)"
" Index Cond: (artists @> '[{""z"": 2}]'::jsonb)"
答案 0 :(得分:2)
实际上使用了索引just use larger test data.
规划人员可以根据数据选择不同的计划。通常情况下,规划人员不会对数量较少的数据集使用索引,并在数据量增加时开始使用它。