如何在postgres中使用jsonb索引
How to use jsonb index in postgres
我的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;
这些是 return 正确的数据,但没有人使用索引。
我看到解释了:
-> Seq Scan on public."ScheduledJob" (cost=0.00..4.55 rows=1 width=532)
所以,我不知道为什么没有使用索引,以及如何正确使用jsonb的索引。
更新:
- 我在插入数据前创建索引,查询可以使用索引。
- 但是我在插入第一条数据后创建索引,查询将是
扫描所有记录。
这个好奇怪,先插入数据怎么让索引有用呢
所以,我做了一些研究和测试:
SELECT body FROM "ScheduledJob" WHERE (body#>'{JobName}' = '"analytics_import_transaction_job"') LIMIT 10;
这种查询永远不会使用索引。
并且只有table有足够的数据,索引随时可用。
我的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;
这些是 return 正确的数据,但没有人使用索引。 我看到解释了:
-> Seq Scan on public."ScheduledJob" (cost=0.00..4.55 rows=1 width=532)
所以,我不知道为什么没有使用索引,以及如何正确使用jsonb的索引。
更新:
- 我在插入数据前创建索引,查询可以使用索引。
- 但是我在插入第一条数据后创建索引,查询将是 扫描所有记录。
这个好奇怪,先插入数据怎么让索引有用呢
所以,我做了一些研究和测试:
SELECT body FROM "ScheduledJob" WHERE (body#>'{JobName}' = '"analytics_import_transaction_job"') LIMIT 10;
这种查询永远不会使用索引。
并且只有table有足够的数据,索引随时可用。