PostgreSQL顺序扫描在微小的桌子上慢

时间:2009-12-22 10:53:52

标签: postgresql performance

我在PostgreSQL中有一个表,我需要读入内存。这是一个非常小的表,只有三列和200行,我只是在整个事情上做select col1, col2, col3 from my_table

在开发机器上,这非常快(小于1毫秒),即使该机器是Mac OS FileVault内的VirtualBox。

但是在生产服务器上它始终需要600毫秒。生产服务器可能具有较低的规格,数据库版本也较旧(7.3.x),但我认为仅凭这一点无法解释巨大的差异。

在这两种情况下,我在数据库服务器本身上运行explain analyze,因此它不能是网络开销。查询执行计划在两种情况下都是简单的顺序全表扫描。当时生产机器上也没有其他任何事情发生,因此也存在争议。

如何找出为什么这么慢,我该怎么办呢?

3 个答案:

答案 0 :(得分:3)

听起来好像你还没有正确地对这个数据库进行真空管理? 7.3 方式太旧而无法使用AutoVacuum,所以这是你必须手动完成的事情(建议使用cron作业)。如果您对此表进行了许多更新(随着时间的推移)而未运行VACUUM,则访问速度将非常慢。

答案 1 :(得分:2)

显然表格臃肿。对相关表格进行真空分析。还 - 升级。 7.3甚至不再受支持了。

答案 2 :(得分:0)

如果多次运行查询会发生什么? fisrt run应该很慢,但其他的应该更快,因为第一次执行将数据放入缓存中。

顺便说一句:如果你没有任何限制地进行SELECT ... FROM,你有一个seq扫描100%正常,你必须seq扫描来检索值,并且因为你有限制,所以没有必要进行索引扫描。

不要犹豫,发布您的Explain Analyze查询结果。

PostgreSQL 7.3真的很旧,无法升级到更现代的版本吗?