我有大约1000万行的表,id列是primary key。
然后删除所有行where id > 10。只有10行保留在表中。
现在,当我运行查询SELECT id FROM tablename时,执行时间大约为1.2-1.5秒。
但是SELECT id FROM tablename where id = x只需要10-11毫秒.
为什么第一个SELECT只运行10行就这么慢?
发布于 2015-12-15 12:24:32
主要原因是Postgres的MVCC模型,其中删除的行被保留,直到系统能够确保事务不会回滚,死行不再对任何并发事务可见。只有这样,死行才能被VACUUM --或者更根本的VACUUM FULL --物理地删除。
相关信息:
您的简单查询SELECT id FROM tablename --如果在DELETE之后立即运行,在自动真空可以启动之前--仍然可以找到1000万行,并且必须检查可见性,但只排除了其中的大多数行。
第二个查询SELECT id FROM tablename where id = x可以使用主键索引,只需要从(以前)大表中读取单个数据页。这种查询在很大程度上不受表的总大小的影响。
可能有一种更有效的方法来删除几乎所有的1000万行:
https://stackoverflow.com/questions/34288512
复制相似问题