我們有一個要求,那就是我們要從數據庫中選擇k個隨機行。 所以,我們INTIAL想到要去這樣的: -從postgres django中選擇k個隨機行ORM
table.objects.filter(..).order_by('?')[:k]
但後來我們看到在互聯網上,這是非常低效的解決方案,所以我們想出了這個(沒有那麼創新): -
但是這似乎比以前更慢。
所以,我們想知道什麼是正確的方法,從數據庫中正確選擇k行,在我們的例子中是postgres。
我們有一個要求,那就是我們要從數據庫中選擇k個隨機行。 所以,我們INTIAL想到要去這樣的: -從postgres django中選擇k個隨機行ORM
table.objects.filter(..).order_by('?')[:k]
但後來我們看到在互聯網上,這是非常低效的解決方案,所以我們想出了這個(沒有那麼創新): -
但是這似乎比以前更慢。
所以,我們想知道什麼是正確的方法,從數據庫中正確選擇k行,在我們的例子中是postgres。
丹尼爾·羅斯曼在評論中提到,之所以
是緩慢的,因爲你必須獲取所有對象,然後找到k
的是,查詢集的。
我也遇到過完全相同的類型的問題,我們解決的方法,這是對
max_id
。1, ..., max_id
k
號做table.objects.filter(id__in=set_of_ks)
這當然假設有在一套表ID沒有「漏洞」。
但它執行兩個查詢,不是嗎? –
是的,但是應該在固定的時間讀取'max_id',所以它非常快。下一個查詢就是你想要的行,你必須做。 – Tobias
那麼,如果你大致知道你的表的大小,你可以使用新的TABLESAMPLE子句隨機選擇一個百分比的行。然後,你可以隨時限制它。
一篇簡短的博客文章涵蓋了它。
製作[:k]是一個很好的方法,因爲它會自動設置您的SQL中的LIMIT。 – sebb
'order_by('?')'大桌子真的很慢。獲取'max_id'的速度更快,然後從Python代碼中的集合'1,...,max_id'中選擇'k'數字。 – Tobias
第二個效率較低,因爲您正在獲取所有匹配的行,而不僅僅是您需要的k。 –