如何在postgres中使用jsonb索引

时间:2017-03-21 04:42:48

标签: postgresql indexing jsonb

我的pg是9.5+。 我在“body”栏中有一个jsonb数据:

{
   "id":"58cf96481ebf47eba351db3b",
   "JobName":"test",
   "JobDomain":"SAW",
   "JobStatus":"TRIGGERED",
   "JobActivity":"ACTIVE"
}

我为body和key创建了索引:

CREATE INDEX scheduledjob_request_id_idx ON "ScheduledJob" USING gin ((body -> 'JobName'));
CREATE INDEX test_index ON "ScheduledJob" USING gin (body jsonb_path_ops)

这是我的疑问:

SELECT body FROM "ScheduledJob" WHERE body @> '{"JobName": "analytics_import_transaction_job"}';
SELECT body FROM "ScheduledJob" WHERE (body#>'{JobName}' = '"analytics_import_transaction_job"')  LIMIT 10;

这些是返回正确的数据,但没有人使用索引。 我看到了解释:

->  Seq Scan on public."ScheduledJob"  (cost=0.00..4.55 rows=1 width=532)

所以,我不知道为什么没有使用索引,以及如何正确使用jsonb的索引。

更新

  • 我在插入数据之前创建索引,查询可以使用索引。
  • 但是我插入第一个数据后创建索引,查询将是 扫描所有记录。

这很奇怪,如何在首次插入数据时使索引有用。

1 个答案:

答案 0 :(得分:0)

所以,我做了一些研究和测试:

SELECT body FROM "ScheduledJob" WHERE (body#>'{JobName}' = '"analytics_import_transaction_job"')  LIMIT 10;

这种查询永远不会使用索引。

只有表格有足够的数据,索引随时可用。