Sql 为什么不使用GIN索引?

Sql 为什么不使用GIN索引?,sql,postgresql,indexing,jsonb,Sql,Postgresql,Indexing,Jsonb,我有一个jsonb字段,其中包含如下数据: {"state": "initialize_done_state", ... } 此字段上的索引: CREATE INDEX index_activities_on_data ON activities USING gin (data) 以及执行查询: select count(*) from activities a where a.created_at >= (date_trunc('month', current_date)::time

我有一个jsonb字段,其中包含如下数据:

{"state": "initialize_done_state", ... }
此字段上的索引:

CREATE INDEX index_activities_on_data ON activities USING gin (data)
以及执行查询:

select count(*)
from activities a
where a.created_at >= (date_trunc('month', current_date)::timestamp AT TIME ZONE 'MSK') and
      --a.data ->> 'state' = 'issued_success_state';
      a.data @>  '{ "state": "issued_success_state" }';
当我在WHERE子句中使用@>运算符时,会使用gin索引:

Aggregate  (cost=406.91..406.92 rows=1 width=8)
->  Bitmap Heap Scan on activities a  (cost=32.75..406.67 rows=95 width=0)
Recheck Cond: (data @> '{"state": "issued_success_state"}'::jsonb)
Filter: (created_at >= timezone('MSK'::text, (date_trunc('month'::text, (('now'::cstring)::date)::timestamp with time zone))::timestamp without time zone))
->  Bitmap Index Scan on index_activities_on_data  (cost=0.00..32.73 rows=364 width=0)
Index Cond: (data @> '{"state": "issued_success_state"}'::jsonb)
当我使用->>运算符时,不使用:

Aggregate  (cost=59093.42..59093.43 rows=1 width=8)
->  Seq Scan on activities a  (cost=0.00..59092.23 rows=477 width=0)
Filter: (((data ->> 'state'::text) = 'issued_success_state'::text) AND (created_at >= timezone('MSK'::text, (date_trunc('month'::text, (('now'::cstring)::date)::timestamp with time zone))::timestamp without time zone)))
请解释原因?

来自

jsonb的默认GIN运算符类支持具有顶级键exists运算符?、?&和?|运算符以及路径/值exists运算符@>的查询

您可以创建一个B树索引,该索引可与
->
运算符一起使用,例如

CREATE INDEX ON activities ((data->>'state'));

jsonb的默认GIN运算符类支持具有顶级键exists运算符?、?&和?|运算符以及路径/值exists运算符@>的查询

您可以创建一个B树索引,该索引可与
->
运算符一起使用,例如

CREATE INDEX ON activities ((data->>'state'));