为什么计数(*)在一个PostgreSQL数据库中花费的时间非常长,而在另一个数据库中却不花?

为什么计数(*)在一个PostgreSQL数据库中花费的时间非常长,而在另一个数据库中却不花?,postgresql,count,Postgresql,Count,我有两个博士后数据库。在一个表中,我有两个表,每个表大约有8000000行,对其中任何一行进行计数都需要大约一秒钟。在另一个数据库(也是Postgres)中,有1000000行的表,计数需要10秒,一个表大约有6000000行,计数需要3分钟才能运行。什么因素决定了这需要多长时间?它们在不同的机器上,但需要更长时间的数据库在更快的机器上 我读过关于博士后人数总体上是如何缓慢的,但这对我来说似乎很奇怪。我不能真正使用变通方法,因为我使用的是django,它在管理中进行计数,这会花费很长时间,而且使

我有两个博士后数据库。在一个表中,我有两个表,每个表大约有8000000行,对其中任何一行进行计数都需要大约一秒钟。在另一个数据库(也是Postgres)中,有1000000行的表,计数需要10秒,一个表大约有6000000行,计数需要3分钟才能运行。什么因素决定了这需要多长时间?它们在不同的机器上,但需要更长时间的数据库在更快的机器上

我读过关于博士后人数总体上是如何缓慢的,但这对我来说似乎很奇怪。我不能真正使用变通方法,因为我使用的是django,它在管理中进行计数,这会花费很长时间,而且使用起来很困难


这方面的任何信息都会有帮助。

索引、缓存、磁盘速度,对于初学者来说都会产生影响。

计数速度不仅取决于表中的行数,还取决于从磁盘读取数据所用的时间。时间取决于很多事情:

  • 表中的行数-如您所述
  • 每页记录数(如果每条记录占用更多空间,则需要读取更多页才能读取相同数量的行)
  • 如果页面只满了一部分,你就得多读几页
  • 如果表已经缓存在内存中(这里有更多可用内存的帮助)
  • 如果使用小索引对表进行索引(可以计算索引)
  • 硬件差异
  • 等等
慢表是否正确吸尘

不要使用真空满,它只会创建表和索引膨胀。真空是绝对足够的。真空分析会更好


并确保autovacuum已打开并正确配置

在两个数据库上执行完全真空操作,然后重试。它的速度很慢,因为它必须读取表中的每个活动行,它无法使用索引,因为这可能包含死行。如果急需真空,它可能会在Postgres中对其产生很大影响。索引有助于Postgres的计数,但索引本身不能单独计数,因为它需要检查表中的可见性信息。我运行了一个真空分析,它仍然很慢