2016-12-22 6 views
0

У меня есть следующий HQL запросHQL: Произвольное запрос 100 из 10000 записей

Query q = session.createQuery 
("Select j.salaryStartRange From Job j where region like (:region) and 
uniquejobid in (:ujIds) and j.salaryStartRange > 10000 
and (:degreeName) in elements(j.areasOfStudy) order by rand()"); 
    q.setParameterList("ujIds", ujIds); 
    q.setParameter("region", region); 
    q.setParameter("degreeName", degreeName); 

Кажется, что время запроса не одно и то же, независимо от того, использую ли я:

List<Integer> result = q.setFirstResult(0).setMaxResults(100).list(); 

или

List<Integer> result = q.list(); 

Иными словами, полный запрос возможных результатов ведется в обоих запросах. Предел maxResults, по-видимому, устанавливается только после завершения запроса. Я только хочу запросить случайный выбор из 100 записей (из потенциально тысяч записей). Как создать такой запрос?

Сумма: Как я могу случайным образом запросить 100 из 10000 записей максимально эффективно?

+0

Может быть множество причин, по которым вы здесь не видите никакой разницы. Какую базу данных, диалект и драйвер вы используете? – Naros

+0

postgressql; пул соединений c3p0; org.postgresql.Driver; org.hibernate.dialect.PostgreSQLDialect Правильно ли, что оба подхода фактически выполняют полный запрос без ограничений? – Jake

ответ

1

Для того, чтобы PostgreSQL обрабатывал ORDER BY RAND(), сама база данных должна будет извлекать все строки для случайного выбора соответствующих строк. На небольших таблицах вы, вероятно, никогда не заметите каких-либо проблем со скоростью, но на больших таблицах вы будете.

Если бы я вставить 100 миллионов строк в таблицу и выдать следующий запрос:

SELECT id, data FROM MyTable ORDER BY RANDOM() LIMIT 10 

Этот конкретный запрос занимает несколько секунд, чтобы процесс, только вернуть 10 строк. Если вы изучите план объяснения, вы увидите, что стоимость сортировки на 100 миллионов строк.

Вы можете найти решение с сообщением this.

+0

Не тот ответ, на который я надеялся (вздох) ... но, тем не менее, полезный ответ. благодаря – Jake

 Смежные вопросы

  • Нет связанных вопросов^_^