Е, за всеки ред в "групи", postgresql прави пълно сканиране на products_categories, което не е добре. Не непременно проблем с конфигурацията, но може би заявката може да бъде заявена без влагане на подзаявки като този?
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
Също така прави products_categories
имат индекс на product_id
?