极度减小尺寸后 table 性能变慢
Slow performance with small table after extreme reduction of size
我有 table 大约有 1000 万行,id
列是 primary key
。
然后我删除所有行 where id > 10
。 table.
中只剩下 10 行
现在,当我 运行 查询 SELECT id FROM tablename
时,执行时间大约为 1.2 - 1.5 秒。
但是 SELECT id FROM tablename where id = x
只需要 10 - 11 毫秒。
为什么只有 10 行的第一个 SELECT
这么慢?
主要原因是MVCC model of Postgres,删除的行一直保留到系统可以确定事务没有回滚并且死行不再对任何并发事务可见为止。只有这样,死行才能通过 VACUUM
物理删除 - 或者更彻底地 VACUUM FULL
.
相关:
您的简单查询 SELECT id FROM tablename
- 如果 运行 在 DELETE
之后和 autovacuum 可以启动之前 - 仍然找到 1000 万行并且必须检查可见性,只是为了排除他们中的大多数。
你的第二个查询 SELECT id FROM tablename where id = x
可以使用主键索引,只需要从(以前的)大 table 读取单个数据页。这种查询在很大程度上不受 table 总大小的影响。
可能有一种(多)更有效的方法来删除几乎所有 1000 万行:
- Best way to delete millions of rows by ID
- Copying timestamp columns within a Postgres table
- What causes large INSERT to slow down and disk usage to explode?
我有 table 大约有 1000 万行,id
列是 primary key
。
然后我删除所有行 where id > 10
。 table.
现在,当我 运行 查询 SELECT id FROM tablename
时,执行时间大约为 1.2 - 1.5 秒。
但是 SELECT id FROM tablename where id = x
只需要 10 - 11 毫秒。
为什么只有 10 行的第一个 SELECT
这么慢?
主要原因是MVCC model of Postgres,删除的行一直保留到系统可以确定事务没有回滚并且死行不再对任何并发事务可见为止。只有这样,死行才能通过 VACUUM
物理删除 - 或者更彻底地 VACUUM FULL
.
相关:
您的简单查询 SELECT id FROM tablename
- 如果 运行 在 DELETE
之后和 autovacuum 可以启动之前 - 仍然找到 1000 万行并且必须检查可见性,只是为了排除他们中的大多数。
你的第二个查询 SELECT id FROM tablename where id = x
可以使用主键索引,只需要从(以前的)大 table 读取单个数据页。这种查询在很大程度上不受 table 总大小的影响。
可能有一种(多)更有效的方法来删除几乎所有 1000 万行:
- Best way to delete millions of rows by ID
- Copying timestamp columns within a Postgres table
- What causes large INSERT to slow down and disk usage to explode?