0

PostgreSQL9をDBとして使用するRailsに次のクエリがあります。

@user_random = User.where(:id => User.where(:pubic_profile_visible => true).order('random()').limit(1).select(:id).collect(&:id)).first

次に、DBサーバー上で:

計画を説明する

Query plan  Limit  (cost=48655.53..48655.53 rows=1 width=4)
Query plan    ->  Sort  (cost=48655.53..50880.35 rows=889930 width=4)
Query plan          Sort Key: (random())
Query plan          ->  Seq Scan on users  (cost=0.00..44205.88 rows=889930 width=4)
Query plan                Filter: (pubic_profile_visible AND (deleted_at IS NULL))

これがボトルネックを引き起こしている理由について何か提案はありますか?ありがとうございました

4

1 に答える 1

1

@wildplasserが言うように、このクエリはあなたが要求したとおりに実行しています。

800,000行すべてをフェッチし、乱数を生成してからそれらをソートしない限り、「LIMIT1」の最低のrandom()を選択することはできません。

「postgresqlselectrandomrow」をグーグルで検索すると、5ダースの有用なスタックオーバーフローの質問と、さまざまなオプションをカバーするdepesz.comの古いブログ投稿へのリンクが表示されます。

http://www.depesz.com/2007/09/16/my-thoughts-on-getting-random-row/

于 2012-11-10T19:07:58.383 に答える