После JOIN метрика стала завышенной, и аналитик добавил DISTINCT ко всей таблице, чтобы убрать дубли. Почему это рискованный подход?

ADISTINCT замедляет выполнение запроса и не даёт использовать индекс, из-за чего база переключается на full scan по таблицам
BDISTINCT удаляет строки без проверки внешних ключей, что может нарушить ссылочную целостность итогового набора данных
CDISTINCT маскирует причину раздувания строк после JOIN и может убрать настоящие повторы в данных, занижая метрику
DDISTINCT не работает с агрегатными функциями SUM и COUNT и поэтому не способен повлиять на завышенный результат метрики
Правильный ответ. DISTINCT поверх результата JOIN убирает симптом, а не причину — раздувание строк из-за связи многие-ко-многим. Корректный подход — дедуплицировать или агрегировать до соединения.

Разбор

После JOIN с дублированием строк DISTINCT может схлопнуть как лишние комбинации, так и легитимные повторы (например, два одинаковых товара в одном заказе), что искажает метрику в обе стороны. Главная проблема — потеря понимания, на каком уровне детализации (order, item, user) считается метрика. Правильный путь: pre-aggregate до уровня нужной сущности или явно выбрать ключ группировки и считать SUM/COUNT по нему. Производительность тут вторична.

Проверь себя · 1/3разбор после ответа
Вы считаете «уникальные покупатели по бренду». Данные: order_items(user_id, product_id) и products(product_id, brand). Один пользователь может купить несколько товаров одного бренда. Какой расчёт на объединённых данных соответствует цели и устойчив к дублированию строк?
Открыть Карьерник в Telegram

Ещё вопросы по теме «JOIN и кардинальность»