HQL:随机查询10000条记录中的100条

时间:2016-12-22 20:54:05

标签: hibernate hql

我有以下HQL查询

   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条记录(可能有数千条记录)。如何创建此类查询?

总之:如何尽可能有效地随机查询10000条记录中的100条?

1 个答案:

答案 0 :(得分:1)

为了让PostgreSQL处理ORDER BY RAND(),数据库本身必须要获取所有行,以便随机选择有问题的行。在小型桌子上,您可能永远不会注意到任何速度问题,但在更大的桌子上,您将会这样做。

如果我要在表格中插入1亿行并发出以下查询:

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

此特定查询需要几秒钟才能处理,只返回10行。如果您要检查解释计划,您会看到排序成本为1亿行。

您可以找到this帖子的解决方案。