Обычно вы начинаете с аналитической функции count(*)
, которая приводит к компактному SQL.
Недостатком этого подхода является то, что данные должны быть отсортированы (см. Операцию WINDOW SORT
). Подход GROUP BY
позволяет избежать сортировки, поскольку можно использовать HASH GROUP BY
, что может привести к повышению производительности.
Ваш пример немного сложнее, так как вы используете не таблицу, а представление, которое объединяет три таблицы - это соединение выполняется дважды для GROUP BY
и для подробных данных; что, конечно, не оптимально.
Итак, я начну с версии запроса для аналитической функции (возможно с опцией PARALLEL
).
Если вы хотите попробовать GROUP BY
, возможна легкая версия:
1) сгруппировать только дублированные ключи
2) заставить OUTER JOIN
назначить MULTI_FLAG
[ 1117]
пример с планом выполнения, приведенным ниже - простой тест с вашими данными
with dups as (
select firstname,lastname from tmp
group by firstname,lastname
having count(*) > 1)
select tmp.FIRSTNAME, tmp.LASTNAME, tmp.MARK,
case when dups.firstname is not NULL then 1 else 0 end as MULTI_FLAG
from tmp
left outer join dups on tmp.firstname = dups.firstname and tmp.lastname = dups.lastname;
Вам все еще нужно получить доступ к вашему представлению дважды, но окончательное соединение будет быстрее (особенно если у вас есть только небольшое количество дублированные ключи).
--------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
--------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 105K| 26M| | 1673 (1)| 00:00:21 |
|* 1 | HASH JOIN RIGHT OUTER| | 105K| 26M| 11M| 1673 (1)| 00:00:21 |
| 2 | VIEW | | 105K| 10M| | 128 (4)| 00:00:02 |
|* 3 | FILTER | | | | | | |
| 4 | HASH GROUP BY | | 105K| 10M| | 128 (4)| 00:00:02 |
| 5 | TABLE ACCESS FULL| TMP | 105K| 10M| | 125 (1)| 00:00:02 |
| 6 | TABLE ACCESS FULL | TMP | 105K| 15M| | 125 (1)| 00:00:02 |
--------------------------------------------------------------------------------------