从postgres django ORM中选择k个随机行

时间:2016-09-16 10:58:48

标签: python django postgresql orm

我们有一个要求,我们要从数据库中选择k个随机行。 所以,我们的初步思想是这样的: -

table.objects.filter(..).order_by('?')[:k]

然后我们通过互联网阅读这是非常低效的解决方案,所以我们想出了这个(不那么创新): -

random.sample(table.objects.filter(..), k)

但这似乎比以前慢得多。

所以,我们想知道从数据库中选择完全 k 行的正确方法是什么,在我们的例子中是postgres。

2 个答案:

答案 0 :(得分:0)

丹尼尔罗斯曼在评论中提到,之所以

random.sample(table.objects.filter(..), k)

很慢,因为您必须获取所有对象,然后从该查询集中找到k

我遇到了完全相同类型的问题,我们解决这个问题的方法是

  • 在表格中找到max_id
  • k
  • 集合中选择1, ..., max_id个号码
  • table.objects.filter(id__in=set_of_ks)

这当然假设表ID集合中没有“漏洞”。

答案 1 :(得分:0)

好吧,如果您大致知道表的大小,可以使用新的TABLESAMPLE子句随机选择行的百分比。然后,你可以随后限制它。

一篇关于它的简短博客文章here

相关问题