Postgres не убирает ненужный distinct
От: vsb Казахстан  
Дата: 22.12.14 11:53
Оценка:
Или я чего то не понимаю, или постгрес не содержит (вроде бы) примитивной оптимизации.

Запрос:
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, то надо будет в клиентском коде писать лишнию логику, чего хотелось бы избежать.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.