【问题标题】:Postgresql: Random and count in one queryPostgresql:在一个查询中随机计数
【发布时间】:2011-11-17 17:07:28
【问题描述】:

我使用 Postgresql 9.1。我有一张桌子,我想在一个查询中完成两件事:

首先:选择一个随机样本行:

select * from table order by random() limit 1;

第二:统计样本从中选出的行数:

select count(1) from table;

由于正确的 random() 函数必须知道所有行,我想知道是否有一种方法可以在一个查询中获得两个结果。

我在猜一些链接:

select count(1), first.* from table order by random();

但我真的不知道该怎么做。

所以我想要一个随机行和总行数。

感谢您的任何想法。

史蒂夫

【问题讨论】:

标签: postgresql random


【解决方案1】:

一种方法:

SELECT *, (SELECT count(*) FROM tbl) AS ct
FROM   tbl
ORDER  BY random()
LIMIT  1;

如果表很大并且性能是一个问题,有一些技巧可以加快随机选择的速度。拥有一个没有间隙的连续列将对此有很大帮助...

如果这适合您,请查看此相关答案:Random Row in MySQL
也适用于 PostgreSQL。仅将random() 替换为rand()

顺便说一句,random() 函数的工作方式完全独立于行数。


这是一个变体,只需要一次顺序扫描即可产生相同的结果:

SELECT *, count(*) OVER () AS ct
FROM   ef.adr
ORDER  BY random()
LIMIT  1;

不过,使用 5k 行的表进行快速测试会比较慢。
另一个有 400k 行的表显示了类似的结果。稍微慢一点。窗口函数可能会消耗性能。众所周知,对于 PostgreSQL 中的大型表,count(*) 相当慢,因为必须访问每个元组。

仅索引扫描(“覆盖索引”)最近已在 9.2 的开发版本中实现。所以我们在这里加速下一个版本。在related post on dba.stackexchange.com 中了解更多信息:

同时,400k 表的 230 毫秒也不算太差。

【讨论】:

  • 更新:在 PG 9.4 上,这确实运行得更快(与您回答我的问题时我使用的 PG 9.1 相比)
猜你喜欢
  • 2021-03-23
  • 2019-02-01
  • 1970-01-01
  • 2015-01-16
  • 1970-01-01
  • 1970-01-01
  • 2015-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多