Дублирование строк с помощью Hibernate с большими наборами данных

Недавно я задал этот вопрос о том, как запрашивать повторяющиеся строки в БД. Ответ, который я получил, работал и был намного быстрее, но я расширил набор данных с 20 000 строк до 80 000 строк, и время, затрачиваемое на запрос, составляет минуты, что неприемлемо.

Если у меня есть такая таблица:

ID    Name    Country
1     Dave    UK
2     Jim     UK
3     Dave    UK
4     Dave    US
5     Jim     US

Я хочу иметь возможность возвращать строки 1 и 3, потому что это единственные строки, в которых комбинация имени и страны появляется более одного раза.

Текущий ответ заключался в следующем:

select r 
from Runner r  
where exists
(
    select rn
    from Runner rn
    where rn.id <> r.id 
    and rn.name = r.name
    and rn.country = r.country
)

Но это занимает слишком много времени. Мне было интересно, может ли кто-нибудь оптимизировать этот запрос, чтобы быть более эффективным в сравнении, или есть ли какие-либо стратегии для значительного повышения производительности запроса?


person christopher    schedule 27.08.2015    source источник


Ответы (1)


Это не обязательно должен быть подзапрос.

Как насчет следующего запроса

select name, country, count(1) from Runner group by name, country having count(1) > 1

Основываясь на пересмотренных потребностях, вы можете использовать это:

select * 
from Runner r1 
inner join ( 
    select name, country, count(1) 
    from Runner 
    group by name, country 
    having count(1) > 1) r2 on (r1.name = r2.name and r1.country = r2.country)
where r1. name = ?

Предложение where для общего запроса является лишь примером, если вы хотите ограничить результаты.

person ajoshi    schedule 27.08.2015
comment
Я попытался сделать что-то подобное, и это выдало ошибку, потому что в предложении group by не было идентификатора. - person christopher; 27.08.2015
comment
Пожалуйста, попробуйте запросить браузер. Если вы не включаете идентификатор в запрос, его не нужно включать в предложение group by. - person ajoshi; 27.08.2015
comment
Да, но я не хочу возвращать только имя и страну. Я хочу вернуть весь объект, который будет неявно включать идентификатор. - person christopher; 27.08.2015
comment
Следующее должно дать вам все столбцы всех строк всех повторяющихся комбинаций имени и страны; и это включает в себя идентификатор. Не стесняйтесь добавлять предложение where во внешний запрос: выберите * из внутреннего соединения Runner r1 ( выберите имя, страну, количество (1) из группы Runner по имени, страну, имеющую количество (1) › 1) r2 on (r1.name = r2.name и r1.country = r2.country) - person ajoshi; 29.08.2015
comment
Можете ли вы отредактировать это в своем ответе? Я попробую это в понедельник и отвечу с запросом. - person christopher; 29.08.2015