PostgreSQL多重计数查询性能

PostgreSQL多重计数查询性能,sql,postgresql,count,sqlperformance,Sql,Postgresql,Count,Sqlperformance,我正在postgres中编写一个查询,以选择包含更多评论的帖子 下面的方法很管用,但我想知道这是否会成为许多帖子的性能问题 查询: SELECT po.*, (SELECT count(id) FROM comments WHERE post_id = po.id) AS comments_count FROM posts AS po ORDER BY comments_count DESC LIMIT 10; id title body c

我正在postgres中编写一个查询,以选择包含更多评论的帖子

下面的方法很管用,但我想知道这是否会成为许多帖子的性能问题

查询

SELECT 
    po.*, 
    (SELECT count(id) FROM comments WHERE post_id = po.id) AS comments_count
    FROM posts AS po
    ORDER BY comments_count DESC
    LIMIT 10;
id   title  body  comments_count
2    Foo    Bar   5
1    Click  Bait  4
结果

SELECT 
    po.*, 
    (SELECT count(id) FROM comments WHERE post_id = po.id) AS comments_count
    FROM posts AS po
    ORDER BY comments_count DESC
    LIMIT 10;
id   title  body  comments_count
2    Foo    Bar   5
1    Click  Bait  4

我可以做些什么来提高这个查询的性能吗?或者可以吗?

您可以使用join而不是相关子查询。假设id是posts表中的PK:

select p.*,
    count(c.id) as comments_count
from posts p join comments c on p.id = c.post_id
group by p.id
order by comments_count desc limit 10;


在第二个例子中,我得到了这个错误:
WHERE的参数必须是boolean类型,而不是integer类型
@pietrovismara-这是一个输入错误。更新了答案。不管怎样,请现在就尝试,将第一次查询的
EXPLAIN
结果与我的进行比较,您的结果看起来要好得多。这是因为使用联接只对匹配的注释进行计数,而不是对所有注释进行计数吗?这是因为相关的子查询。它的复杂性是
O(n^2)