2017-04-02 4 views
0

J'écris une requête dans postgres pour sélectionner les messages avec plus de commentaires.PostgreSQL compte plusieurs fois la performance des requêtes

Les travaux suivants, mais je me demande si cela pourrait devenir un problème de performance avec de nombreux messages.

Recherche:

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; 

Résultat:

id title body comments_count 
2 Foo Bar 5 
1 Click Bait 4 

Y at-il quelque chose que je peux faire pour améliorer cette performance de requête ou est-ce ok?

Répondre

1

Vous pouvez utiliser la jointure au lieu de la sous-requête corrélée. id est l'hypothèse PK dans les messages de table:

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; 

ou

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

Dans le deuxième exemple que je reçois cette erreur: argument 'WHERE doit être de type booléen, tapez pas integer' – pietrovismara

+0

@pietrovismara - C'était une faute de frappe. Mise à jour de la réponse S'il vous plaît essayez maintenant – GurV

+0

Quoi qu'il en soit, en comparant le résultat 'EXPLAIN' pour votre première requête et le mien, le vôtre semble beaucoup mieux. Est-ce parce que l'utilisation de rejoindre le compte est fait uniquement sur les commentaires correspondants au lieu de tous? – pietrovismara