2016-12-25 6 views
0

私は、postgresデータベースからランダムなXエントリのセットをsqlalchemyを使用して取得したいと考えています。私の最初のアプローチは、私のテーブルはかなり大きいので、このランダムなデータベースエントリを取得する

random_set_of_Xrows = models.Table.query.filter(something).order_by(func.random()).limit(len(X)).all() 

は、このコマンドは、約1秒を要した、と私はそれを最適化する方法を疑問に思いました。私はorder_by関数はすべての行を見る必要があると思うので、オフセットを使うと速くなるかもしれません。しかし、私は完全に行数を避ける方法を完全に見ることができませんか?ここ は使用してのアプローチは、しかし、ほとんどの時間はをrowCountを取得過ごして、より高速ではありません

rowCount = db.session.query(func.count(models.Table.id)).filter(something).scalar() 
random_set_of_Xrows = models.Table.query.offset(func.floor(func.random()*rowCount)).limit(len(X)).all() 

オフセットです。 これをもっと速くする方法はありますか? 歓声 カール

EDIT:それはdoesnのための下方に示唆したように、私は、ランダムな値を持つテーブルに列を追加し、

random_set_of_Xrows = models.Table.query.filter(something).order_by(models.Table.random_value).limit(len(X)).all() 

ような行を抽出することに使用されるIは、オフセット部分を無視しました2つの呼び出しで同じ結果が得られる場合は、ランダムな行セットが必要です。

+0

それは役に立ちますか? https://stackoverflow.com/questions/60805/getting-random-row-through-sqlalchemy#60815 –

+0

これまで見てきましたが、行数を避けるという問題には実際には対応していません...可能ならばまったく... – carl

+0

hi hiro ...申し訳ありませんが、この提案と私の最初のアプローチの違いは何ですか? – carl

答えて

1

これまで、行が作成されたときにランダムな値を自動的に挿入するインデックス付きの列rを追加することで、これを最適化しました。次にランダムな行セットが必要なときは、ちょうどSELECT * FROM table ORDER BY r LIMIT 10 OFFSET some_random_valueです。スキーマを更新するスクリプトを実行して、この列を既存の行に追加することができます。このアプローチでは、書き込みに若干のパフォーマンスヒットが追加されますが、これが永続的に必要な機能であれば、それは公正な取引でなければなりません。

+0

こんにちはmVChr ...答えに感謝します。 order_byはすべての行を見る必要があると思いますか? – carl

+0

私の前のコメントを更新するには...私はそれを実装し、私の以前のソリューションよりも高速ではありません... – carl

+0

上記の私の正確な実装を追加して、あなたのアプローチは高速です...私があなたの答えを受け入れるでしょう – carl

関連する問題