【发布时间】:2020-04-09 16:06:17
【问题描述】:
我有表user 一千万行。它有字段:id int4 primary key、rating int4、country varchar(32)、last_active timestamp。它在标识符上有差距。
任务是为给定的国家随机选择五个用户,这些用户在过去两天内活跃并且在给定范围内具有评级。
有没有比下面的查询更快地选择它们的棘手方法?
SELECT id
FROM user
WHERE last_active > '2020-04-07'
AND rating between 200 AND 280
AND country = 'US'
ORDER BY random()
LIMIT 5
它想到了这个查询:
SELECT id
FROM user
WHERE last_active > '2020-04-07'
AND rating between 200 AND 280
AND country = 'US'
AND id > (SELECT random()*max(id) FROM user)
ORDER BY id ASC
LIMIT 5
但问题是有很多非活动用户的标识符值很小,大多数新用户都在 id 范围的末尾。所以,这个查询会过于频繁地选择一些用户。
【问题讨论】:
-
请显示当前计划的解释(分析,缓冲区)。加快速度的最佳方法可能是使现有查询更快,而不是试图找到不太正确的查询。
-
这是来自生产数据库的output。我已经发现它是在默认设置下运行的。我还从查询中排除了
country列,因为它仅在开发代码中。
标签: sql postgresql random