计算表中行数的最有效方法是什么?

and*_*sen 6 postgresql performance count query-performance

我在以下查询中使用 Postgres:

select count(*) from image;
Run Code Online (Sandbox Code Playgroud)

此表上的主键是非递增的;它是存储在表中的图像的唯一序列号。我们的应用程序经常尝试摄取已经记录在数据库中的图像,因此主键/序列号确保它们只记录一次。

现在我们想知道是否应该使用递增的主键。我们在数据库中有 1,259,369 张图像,运行计数查询大约需要 7 分钟。

我们的应用程序永远不会从该表中删除图像 - 因此递增的主键将允许我们检查最后一个 ID 的值,该值等于表中的行数。

Erw*_*ter 7

一般来说,如果你并不需要一个精确的计数,有多少更快的方式:

SELECT reltuples::bigint AS estimate
FROM   pg_class
WHERE  oid = 'image'::regclass;
Run Code Online (Sandbox Code Playgroud)

事实上,在并发写入访问的数据库中,每个计数都是一个估计值,因为该数字可能在您获得它的那一刻就过时了。

但是,就像@a_horse 评论的那样,您的数据库中有一些问题。在最坏的情况下,数一百万应该不会超过几秒钟。

app will never delete images from this table让这更加可疑,因为不应该有很多死行。(或者你更新很多?)大量的死元组可能会减慢你的速度 - 并要求VACUUM. 通常,autovacuum会处理这个问题。你启用了吗?(这是现代 Postgres 的默认设置。)

检查死元组:

所有关于性能优化的常用建议都适用。