Postgresql:在一个查询中随机和计数

Postgresql:在一个查询中随机和计数,postgresql,random,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 o

我使用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();
但我真的不知道怎么做

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

谢谢你的建议

史蒂夫

一种方法:

SELECT *, (SELECT count(*) FROM tbl) AS ct
FROM   tbl
ORDER  BY random()
LIMIT  1;
如果表很大,而性能是一个问题,那么有一些技巧可以加快随机选择的速度。拥有一个没有空白的连续专栏会对这方面有很大帮助

如果是您,请查看以下相关答案:
也适用于PostgreSQL。仅将
rand()
替换为
rand()

顺便说一句,
random()
函数的工作完全与行数无关


以下是一种仅通过一次顺序扫描产生相同结果的变体:

SELECT *, count(*) OVER () AS ct
FROM   ef.adr
ORDER  BY random()
LIMIT  1;
但是,使用一个包含5k行的表进行快速测试要慢一些。
另一个包含400k行的表显示了类似的结果。稍微慢一点。窗口函数可能会影响性能。对于PostgreSQL中的大型表,count(*)的速度非常慢,因为必须访问每个元组

仅索引扫描(“覆盖索引”)最近已在9.2的devel版本中实现。因此,我们将在下一个版本中进行加速。更多关于这方面的信息,请参阅:


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

所以你想要一个随机行和总行数?这个问题与有有趣答案的问题非常相似……更新:在第9.4页上,这确实运行得更快(与你回答我的问题时我使用的第9.1页相比)