Postgresql:随机并计入一个查询

时间:2011-11-17 17:07:29

标签: postgresql random

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

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

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

感谢任何想法。

史蒂夫

1 个答案:

答案 0 :(得分:2)

一种方法:

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行表的显示了类似的结果。稍慢。窗口函数可能是性能损失。已知count(*)对于PostgreSQL中的大表来说相当慢,因为每个元组都必须被访问。

最近在9.2版的devel版本中实现了仅索引扫描(“覆盖索引”)。所以我们在这里加速下一个版本。有关详情请参阅related post on dba.stackexchange.com

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