Объяснение Oracle PARTITION BY против GROUP BY для похожих результатов

5 баллов в защиту Python
  1. Простота: поведение прост в следующем смысле: большинство людей попадают в эту ловушку только один раз, а не несколько раз.
  2. Согласованность: Python всегда передает объекты, а не имена. Параметр по умолчанию, очевидно, является частью заголовка функции (а не тела функции). Поэтому он должен оцениваться при времени загрузки модуля (и только при времени загрузки модуля, если не вложен), а не во время вызова функции.
  3. Полезность: Как указывает Фредерик Лунд в своем объяснении Значения параметров по умолчанию в Python ", текущее поведение может быть весьма полезно для расширенного программирования. (Используйте экономно.)
  4. Достаточная документация: в самой базовой документации Python, в руководстве, проблема громко объявляется как «Важное предупреждение» в первом разделе раздела раздела «Подробнее о определении функций» . Предупреждение даже использует жирный шрифт, который редко применяется за пределами заголовков. RTFM: прочитайте тонкое руководство.
  5. Мета-обучение: падение в ловушку на самом деле является очень полезным моментом (по крайней мере, если вы являетесь рефлексивным учеником), потому что впоследствии вы лучше поймете пункт «согласованность», выше, и это научит вас много о Python.

4
задан Pouya Yousefi 26 March 2019 в 14:10
поделиться

1 ответ

Обычно вы начинаете с аналитической функции 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 |
--------------------------------------------------------------------------------------
0
ответ дан Marmite Bomber 26 March 2019 в 14:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: