2009-12-22 74 views
1

我在PostgreSQL中有一张表,我需要读入内存。这是一张非常小的桌子,只有三列和200排,我只做了一件select col1, col2, col3 from my_tablePostgreSQL顺序扫描小表缓慢

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

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

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

怎样才能找出为什么这是如此之慢,我能做些什么呢?

+0

升级尽快 - 7.3不正式支持。 – 2009-12-22 13:43:03

回答

3

听起来像也许你没有正确地使这个数据库真空? 7.3是的方式太老了,没有AutoVacuum,所以这是你必须手动做的事情(建议使用cron作业)。如果你已经有很多更新(随着时间的推移)到这个表,并且不运行VACUUM,它将很慢访问。

+0

我可以在VACUUM上次完成时了解吗? – Thilo 2009-12-22 11:28:28

+0

@Thilo:在7.3 - 你很可能找不到。 – 2009-12-22 11:50:47

+2

虽然没有真正的好方法,但您可以做的一件事就是比较磁盘上表格文件的大小(检查pg_class中的relfilenode以查找文件名)与您认为应在表格中的数据量。如果没有办法,你需要在桌上运行VACUUM FULL和REINDEX。哦,和其他许多人说的一样,升级到支持的Postgres版本。 – 2009-12-22 20:57:27

0

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

顺便说一句:如果你做一个SELECT ... FROM没有任何限制,你有一个seq扫描是100%正常的,你必须seq扫描检索值,并且由于你有限制,没有需要做一个索引扫描。

不要犹豫,发布您的解释分析查询的结果。

PostgreSQL 7.3真的很旧,没有选择升级到更新的版本?

+0

第二次没有变得更快。顺序扫描没有问题,因为这将是读取整个表格的理想访问路径。我只想让扫描花费更少的时间... – Thilo 2009-12-22 11:23:48

2

这显然是表膨胀。对有问题的表进行真空分析。另外 - 升级。 7.3甚至不再支持。

+0

VACUUM似乎是点亮的。我必须要求操作人员这样做。只是为了确认桌子会大量缩小,我怎么能看到它现在占据了多少块?然后,我可以将其与我的开发机器上所具有的内容进行比较。 – Thilo 2009-12-22 11:57:47

+0

它会*不*缩小。它可能会缩小一些,但我不会真正考虑它。 – 2009-12-22 20:32:03

+0

如果它不缩小VACUUM做什么? – Thilo 2009-12-23 05:43:01