【问题标题】:How to use jsonb index in postgres如何在 postgres 中使用 jsonb 索引
【发布时间】:2017-08-12 14:49:09
【问题描述】:

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

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

我为正文和键创建索引:

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的索引。

更新:

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

这太奇怪了,我先插入数据时如何使索引有用。

【问题讨论】:

  • 带有body#>'{JobName}' 的查询永远不会使用(body -> 'JobName') 的索引。使用相同的表达式(即相同的运算符)至少有机会。 -- 请发布EXPLAIN ANALYZE 您的查询。您的表可能没有足够的样本行来使用索引。
  • 除此之外,对于第一个索引,您最好使用INDEX ON "ScheduledJob" USING btree ((body ->> 'JobName'))。
  • 我的表的行现在是 900。这是否太小而无法使用索引?
  • 我尝试了btree,但也有同样的问题。
  • 我把数据加到10000行,查询使用索引!!!谢了!!!

标签: postgresql indexing jsonb


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-21
    • 1970-01-01
    • 2020-06-01
    • 2018-06-25
    • 2018-03-22
    • 2019-01-29
    • 1970-01-01
    • 2020-06-04
    相关资源
    最近更新 更多