2015-06-09 66 views
1

我需要從10MM行表中取回前300行,並計算匹配記錄的總數。OVER()vs兩個查詢 - 哪一個最有效

我可以在兩個查詢做到這一點,是這樣的:

SELECT * FROM table WHERE field = value LIMIT 300; 
SELECT count(*) FROM table WHERE field = value; 

或者我可以使用OVER():

SELECT *, COUNT(*) OVER() AS total FROM table WHERE field = value LIMIT 300; 

這將是最有效的?我不關心是否需要運行兩個查詢,我是最有效的解決方案。我不是專家,我試圖運行一個「解釋」,但它對我沒有多大意義。這是在Amazon Redshift上運行的。

+0

[相關](http://stackoverflow.com/q/7943233/314291) - 它似乎有快捷方法從'pg_class'中獲取PostGres中的近似行數,而不需要統計所有行。 – StuartLC

+1

當談到性能時,首先設置*目標*,然後寫出簡單明瞭的代碼來表達你想要的*。然後*測量*表現,並且只有當它不符合目標時纔開始深入研究。 –

+0

第一排是什麼意思?你不需要定義順序嗎?爲什麼只想要300? – Guy

回答

0

如果您SORTKEY是時間戳字段,最高效的運行將是

select * 
from(
select * , count(*) over() as total, 
row_number() over(order by timestamp) as rank 
from table 
where filed =value) 
where rank<301