我使用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();
但我真的不知道该怎么做。
所以我想要一个随机行和总行数。
感谢任何想法。
史蒂夫
答案 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毫秒也不算太差。