0

我在使用 PostgreSQL 9 作为数据库的 rails 中有以下查询。

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

然后在数据库服务器上:

解释计划

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 行、生成随机数然后对它们进行排序,它就无法为您的“LIMIT 1”选择最低的 random()。

尝试谷歌搜索“postgresql 选择随机行”,你会得到六个有用的 stackoverflow 问题,以及 depesz.com 上一篇旧博客文章的链接,其中涵盖了各种选项:

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

于 2012-11-10T19:07:58.383 回答