2017-01-24 63 views
0

讓我們有一個數據庫表,摹:Postgresql:選擇「最高」和「全部高於」的最高效查詢

t_times (id INTEGER, created TIMESTAMP WITHOUT TIME ZONE); 

有編寫一個查詢,將返回給定日期和創建之前給定日期的最新條目後創建的所有條目的可能性?

UNION很簡單,但是沒有更快的方法嗎?

SELECT * FROM t_times WHERE created >= ? 
UNION 
SELECT * FROM t_times WHERE created < ? ORDER BY created DESC LIMIT 1; 
+0

'union all'更快。 –

回答

1

union all更快:

(SELECT * FROM t_times WHERE created >= ?) 
UNION ALL 
(SELECT * FROM t_times WHERE created < ? ORDER BY created DESC LIMIT 1); 

這可能是與索引更快一點上created

select t.* 
from t_times t 
where t.created >= (select max(t2.created) from t_times where t2.created < ?); 

的想法是,該指數將使用子查詢。 。 。非常快。然後索引用於獲取行。但是,這隻會對union all的查詢稍有改進。

+0

你說得對,UNION ALL更快。但當然這不是主要觀點。您提供的第二個選擇不會每次返回完全相同的結果(注意原始查詢中的LIMIT 1,但對我非常有用)。無論如何,謝謝你的回答。 – user1482710