postgres:为什么这个GIN索引不用于这个"数组中的对象"询问

时间:2017-01-27 00:19:58

标签: postgresql jsonb

我正在尝试索引包含对象数组的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)"

1 个答案:

答案 0 :(得分:2)

实际上使用了索引just use larger test data.

规划人员可以根据数据选择不同的计划。通常情况下,规划人员不会对数量较少的数据集使用索引,并在数据量增加时开始使用它。