Eh bien, pour chaque ligne de "groupes", postgresql effectue une analyse complète de products_categories, ce qui n'est pas bon. Pas nécessairement un problème de configuration, mais peut-être que la requête pourrait être formulée sans imbriquer des sous-requêtes comme ça ?
SELECT count(DISTINCT "groups".id) AS count_all
FROM "groups"
WHERE exists(
select 1 from products p where groups.id = p.group_id
join products_categories pc on pc.product_id = p.id
where pc.category_id in (2,3)
) and groups.id <> 3
Fait également products_categories
avoir un index sur product_id
?