Welnu, voor elke rij in "groepen" voert postgresql een volledige scan uit van products_categories, wat niet goed is. Dit hoeft niet per se een configuratieprobleem te zijn, maar misschien kan de zoekopdracht worden opgegeven zonder subquery's op die manier te nesten?
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
Doet ook products_categories
een index hebben op product_id
?