Короткий ответ На больших объёмах поиск дублей и аномалий стоит делать через агрегирование и оконные функции с фильтрацией по ключевым полям и временному диапазону, избегая полных самосоединений (self-join) без ограничивающих условий, а аномалии искать через сравнение с историческими статистиками по тем же разрезам (дата, сегмент). Как это работает подробнее GROUP BY с HAVING COUNT(*) > 1 на индексированных ключевых полях обычно эффективнее, чем JOIN таблицы самой на себя по этим же полям, так как последний может создавать квадратичный рост промежуточного результата. Для аномалий по времени удобно агрегировать метрику по дням/часам и сравнивать с историческим средним и стандартным отклонением (или процентилями) за предыдущий сопоставимый период. Sanity check: день с cnt, отличающимся от avg_28d более чем на 3×std_28d, стоит проверить вручную на технический сбой (дубликаты событий, задержка в пайплайне) перед тем как считать его реальной аномалией поведения. Пример кода Что использовать на практике На очень бо