PostgreSQL:count()还是保留一个计数器?

rya*_*hee 3 sql postgresql

我有两个一对多的关系表.假设对于表中的每一行,表foo中可以有0行或更多行bar引用该行foo.

对于所有行,客户端想要知道bar引用行foo的行数foo.

我可以使用以下查询完成此操作:

SELECT count(bar_id) FROM bar WHERE bar.foo_id = foo.foo_id;
Run Code Online (Sandbox Code Playgroud)

但是,如果表foobar很大?说foo有100万行,并bar有1000万行.我们还要说99%的行foobar引用少于1,000 行的计数.假设客户端通常一次要求大约100行foo.

我应该使用带有外键索引的naive count()查询,还是更好地保留一个计数器?甚至可以保留一个柜台?通过使用触发器更新计数器的原子增量和减量bar,我相信它是可能的,但我可能是错的.

Cra*_*ger 5

也许与直觉相反,您可能会发现count除非您的工作量非常偏向读取,否则简单的方法会更快.

这样做的原因是计数器表的效果将是序列化更新,因此foo在任何给定时间只有一个更新给定的事务可以在飞行中.这是因为更新计数器的触发器的更新将锁定foo计数器表中的条目,并且在事务回滚或提交之前不会释放它.

更糟糕的是,如果您的事务影响多个,foo而另一个影响影响多,那么由于死锁,其中一个事务很可能会中止.

坚持一个简单的计数,直到你有充分的理由改变它.