2016-09-16 24 views
0

我們有一個要求,那就是我們要從數據庫中選擇k個隨機行。 所以,我們INTIAL想到要去這樣的: -從postgres django中選擇k個隨機行ORM

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

但後來我們看到在互聯網上,這是非常低效的解決方案,所以我們想出了這個(沒有那麼創新): -

但是這似乎比以前更慢。

所以,我們想知道什麼是正確的方法,從數據庫中正確選擇k行,在我們的例子中是postgres。

+0

製作[:k]是一個很好的方法,因爲它會自動設置您的SQL中的LIMIT。 – sebb

+1

'order_by('?')'大桌子真的很慢。獲取'max_id'的速度更快,然後從Python代碼中的集合'1,...,max_id'中選擇'k'數字。 – Tobias

+0

第二個效率較低,因爲您正在獲取所有匹配的行,而不僅僅是您需要的k。 –

回答

0

丹尼爾·羅斯曼在評論中提到,之所以

是緩慢的,因爲你必須獲取所有對象,然後找到k的是,查詢集的。

我也遇到過完全相同的類型的問題,我們解決的方法,這是對

  • 查找表max_id
  • 從組1, ..., max_id
  • 選擇k號做table.objects.filter(id__in=set_of_ks)

這當然假設有在一套表ID沒有「漏洞」。

+0

但它執行兩個查詢,不是嗎? –

+0

是的,但是應該在固定的時間讀取'max_id',所以它非常快。下一個查詢就是你想要的行,你必須做。 – Tobias

0

那麼,如果你大致知道你的表的大小,你可以使用新的TABLESAMPLE子句隨機選擇一個百分比的行。然後,你可以隨時限制它。

一篇簡短的博客文章涵蓋了它​​。