我有一个名为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;
那么查询将变得必须更快。