2011-11-17 72 views
0

我使用Postgresql 9.1。我有一個表,我想在一個查詢來獲取做了兩兩件事:Postgresql:在一個查詢中隨機並計數

第一:選擇一個隨機抽樣行:

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

二:計算行數的樣品選自:

select count(1) from table; 

由於正確的random()函數必須知道所有行,所以我想知道是否有方法在一個查詢中獲得兩個結果。

我猜的東西鏈接:

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

,但我真的不知道該怎麼做。

所以我想要一個隨機行和總行數。

感謝您的任何想法。

史蒂夫做到這一點

+0

所以你想要一個隨機行和總行數? – Aziz

+0

這個問題是非常相似http://stackoverflow.com/questions/5297396/quick-random-row-selection-in-postgres它有有趣的答案... – alfonx

回答

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行的表格顯示了類似的結果。稍微慢一些。窗口功能可能會影響性能。對於PostgreSQL中的大型表而言,count(*)是相當慢的,因爲每個元組都必須被訪問。

最近在9.2的開發版本中實現了僅索引掃描(「覆蓋索引」)。所以我們在這裏爲下一個版本加快速度。更多關於related post on dba.stackexchange.com

與此同時,400k表230毫秒是不是太糟糕。

+0

更新:在PG 9.4這真的跑得更快(比較當你回答我的問題時,我正在使用PG 9.1) – alfonx