PostgreSql未使用索引



我有一个名为snapshots的表,其中列名为jsonb格式的data在快照表上创建索引

create index on snapshots using(( data->>'creator' ));

以下查询最初使用索引,但几天后没有使用

SELECT id, data - 'sections' - 'sharing' AS data FROM snapshots WHERE data->>'creator' = 'abc@email.com' ORDER BY xmin::text::bigint DESC

下面是运行解释分析的输出

Sort  (cost=19.10..19.19 rows=35 width=77) (actual time=292.159..292.163 rows=35 loops=1)
Sort Key: (((xmin)::text)::bigint) DESC
Sort Method: quicksort  Memory: 30kB
->  Seq Scan on snapshots  (cost=0.00..18.20 rows=35 width=77) (actual time=3.500..292.104 rows=35 loops=1)
Filter: ((data ->> 'creator'::text) = 'abc@email.com'::text)
Rows Removed by Filter: 152
Planning Time: 0.151 ms
Execution Time: 292.198 ms

一个有187行的表非常小。对于非常小的表,顺序扫描是最有效的策略。

这里令人惊讶的是查询执行的持续时间很长(292毫秒!(。除非您的存储非常糟糕或过载,否则这一定意味着该表非常臃肿——它相对较大,但几乎所有页面都是空的,只有187个活动行。你应该重写表格来压缩它:

VACUUM (FULL) snapshots;

那么查询将变得必须更快。

最新更新