我的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的索引。
更新
这很奇怪,如何在首次插入数据时使索引有用。
答案 0 :(得分:0)
所以,我做了一些研究和测试:
SELECT body FROM "ScheduledJob" WHERE (body#>'{JobName}' = '"analytics_import_transaction_job"') LIMIT 10;
这种查询永远不会使用索引。
只有表格有足够的数据,索引随时可用。