我创建了一个包含 100 万条记录的表,然后删除了这些记录。(常见于某种处理列表。)
CREATE TABLE example (id int PRIMARY KEY);
INSERT INTO example SELECT generate_series(1, 1000 * 1000);
DELETE FROM example;
VACUUM example;
索引大小保持与删除前相同的大小。
SELECT pg_size_pretty(pg_relation_size(c.oid)) AS size
FROM pg_class c
WHERE oid = 'example_pkey'::regclass;
size
-------
21 MB
(1 row)
同样,膨胀检测查询(例如ioguix/pgsql-bloat-estimation)将此索引识别为极度膨胀。
我不关心磁盘使用本身。指数的表现是否会因规模过大而受到影响?我应该跑步REINDEX
吗?
删除行后的前几个查询可能会产生重大影响,因为 autovacuum 尚未完成对表的处理,并且查询需要挖掘大量属于已删除行的索引条目。
但是,这些索引扫描会将索引条目标记为“死亡”,后续的索引扫描将忽略它们。
在那之后,在
VACUUM
完成之后,索引扫描将几乎和以前一样快。