缓慢执行PostgreSQL查询,不明白为什么

时间:2012-11-10 17:55:23

标签: database performance postgresql

我在使用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))

有关为何导致瓶颈的任何建议?谢谢

1 个答案:

答案 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/