我们有一个要求,我们要从数据库中选择k个随机行。 所以,我们的初步思想是这样的: -
table.objects.filter(..).order_by('?')[:k]
然后我们通过互联网阅读这是非常低效的解决方案,所以我们想出了这个(不那么创新): -
random.sample(table.objects.filter(..), k)
但这似乎比以前慢得多。
所以,我们想知道从数据库中选择完全 k 行的正确方法是什么,在我们的例子中是postgres。
答案 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。