Или я чего то не понимаю, или постгрес не содержит (вроде бы) примитивной оптимизации.
Запрос:
select distinct auc.id, app.id
from auction auc left outer join auction_application app on auc.id = app.auction_id
Отношение auction <- 1 .. n -> auction_application.
Вроде от того, что добавляешь или убираешь distinct логика не должна меняться никак. Дубликатов тут нет по определению и postgres это знает (потому что auc.id и app.id это единственные primary key в соответствующих таблицах). Собственно результаты запросов идентичные. Но выдаются в разных порядках. И план у запросов разный:
с distinct:
"HashAggregate (cost=45.22..51.16 rows=594 width=8)"
" -> Hash Right Join (cost=12.70..42.25 rows=594 width=8)"
" Hash Cond: (app.auction_id = auc.id)"
" -> Seq Scan on auction_application app (cost=0.00..19.90 rows=990 width=8)"
" -> Hash (cost=11.20..11.20 rows=120 width=4)"
" -> Seq Scan on auction auc (cost=0.00..11.20 rows=120 width=4)"
без distinct:
"Hash Right Join (cost=12.70..42.25 rows=594 width=8)"
" Hash Cond: (app.auction_id = auc.id)"
" -> Seq Scan on auction_application app (cost=0.00..19.90 rows=990 width=8)"
" -> Hash (cost=11.20..11.20 rows=120 width=4)"
" -> Seq Scan on auction auc (cost=0.00..11.20 rows=120 width=4)"
Вопрос собственно от того, что тупой Hibernate вставляет distinct там, где он не нужен, и меня это напрягает. Если делать так, чтобы он не вставлял distinct, то надо будет в клиентском коде писать лишнию логику, чего хотелось бы избежать.