我有以下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条?
答案 0 :(得分:1)
为了让PostgreSQL处理ORDER BY RAND()
,数据库本身必须要获取所有行,以便随机选择有问题的行。在小型桌子上,您可能永远不会注意到任何速度问题,但在更大的桌子上,您将会这样做。
如果我要在表格中插入1亿行并发出以下查询:
SELECT id, data FROM MyTable ORDER BY RANDOM() LIMIT 10
此特定查询需要几秒钟才能处理,只返回10行。如果您要检查解释计划,您会看到排序成本为1亿行。
您可以找到this帖子的解决方案。