Частая ошибка - сначала размножают строки джойном, потом сверху лечат это DISTINCT. Это дорого и часто убивает план.
Плохо:
SELECT DISTINCT u.id, u.name
FROM users u
JOIN orders o ON o.user_id = u.id
WHERE o.created_at >= CURRENT_DATE - INTERVAL '30 days';
Лучше так:
SELECT u.id, u.name
FROM users u
WHERE EXISTS (
SELECT 1
FROM orders o
WHERE o.user_id = u.id
AND o.created_at >= CURRENT_DATE - INTERVAL '30 days'
);
DISTINCT часто добавляет sort или hash aggregation на огромном объёме.
EXISTS превращает задачу в semijoin:
• оптимизатору проще остановиться на первом совпадении
• меньше памяти, меньше лишних строк, стабильнее план
Это один из тех рефакторингов, который на больших таблицах реально даёт заметный буст.