我在使用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))
有关为何导致瓶颈的任何建议?谢谢
答案 0 :(得分:1)
就像@wildplasser说的那样,这个查询完全按照你的要求去做。
如果没有获取所有800,000行,生成随机数然后对它们进行排序,它就无法为“LIMIT 1”选择最低的random()。
尝试谷歌搜索“postgresql选择随机行”,你将获得六个有用的stackoverflow问题,以及一个链接到depesz.com上的旧博客文章,其中涵盖了各种选项:
http://www.depesz.com/2007/09/16/my-thoughts-on-getting-random-row/