Обычно вы начинаете с аналитической функции 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 |
--------------------------------------------------------------------------------------
Удостоверьтесь, что NetBeans создан с кодированием, которое поддерживает еврейские символы. От NetBeans Wiki:
Изменить кодирование языка для проекта:
- Щелкните правой кнопкой по узлу проекта в окнах Projects и выберите Properties.
- Под Источниками выберите кодовое значение из Кодирующего выпадающего поля.
Как точно Вы запускаете программу? Где это печатает свой вывод? Это могло быть столь же просто как netbeans или консоль с помощью различных шрифтов, один из которых не включает еврейские символы.
Для устранения проблем кодирования во время компиляции попытайтесь заменить еврейские символы их управляющими последовательность Unicode и посмотрите, отличается ли результат.
Обычно это - кодировка по умолчанию на:
Панель управления \региональный и опции языка \усовершенствованный
(Выберите иврит на комбинации),
Необходимо будет перезапустить после изменения этих настроек.
Иврит установлен по умолчанию? Мог быть то, что пакет языка не установлен?
Панель управления> Региональный и Опции Языка> Языки. Выберите опцию 'Install files for complex script and right-to-left languages (including Thai)'. Это установит поддержку иврита. Вам, вероятно, будет нужен диск ОС.
Я думаю, что неправильно понял Вашу проблему (я думал, что символы не отображались в редакторе NetBeans правильно). Точные шаги для решения проблемы могли бы зависеть от версии ОС, на которой Вы работаете. Win2K, WInXP и Vista у всех есть немного отличающиеся диалоговые окна и формулирующий, к сожалению.
Смотрите на эту страницу справки для JVM:
Это кажется, что Вы уже настроили систему как он, должен быть, но дьявол находится в деталях - существует несколько различных настроек 'локали' в системе, которая могла бы влиять на это (и кто знает JVM могла бы добавить один или два самостоятельно).
Вы не можете установить "file.encoding" свойство с System.setProperty()
; это должно быть установлено на командной строке, когда JVM запускается с -Dfile.encoding=UTF-8
. Значение этого свойства читается во время инициализации JVM и кэшируется. К этому времени Ваш main
метод вызывается, значение кэшировалось, и изменения в свойстве проигнорированы.