2015-06-24 38 views
0

我在postgresql中有兩個表:ITEM(ID,TYPE)和ITEM_DATA(TS,ITEM_ID),關係爲1:n。第一張桌子很小,第二張桌子很大。我想知道從ITEM表中選擇每一行的ITEM_DATA表的最小值和最大值的最佳方法。在這一刻我有這樣的選擇,但它的速度太慢:如何從另一個表中選擇MIN和MAX

SELECT 
    I.*, 
    (SELECT MIN(ID.TS) FROM ITEM_DATA ID WHERE ID.ITEM_ID=I.ID) AS MIN_TS, 
    (SELECT MAX(ID.TS) FROM ITEM_DATA ID WHERE ID.ITEM_ID=I.ID) AS MAX_TS 
FROM ITEM I 
WHERE I.TYPE = 'X'; 

有一個在表的主鍵ITEM_DATA它有兩個部分:TS和ITEM_ID而且還對其中有一個表項的索引段:TYPE。

有沒有辦法讓這個查詢更快?

+0

ITEM表中有多少行,在那裏,有多少行的ITEM_DATA表中受益? ITEM_DATA還有很多其他列嗎? –

+0

ITEM有數百個,ITEM_DATA有數百萬個 – miloxe

回答

1

我想你應該顛倒ITEM_DATA上PK列的順序。

+0

我試過了,但沒有幫助。 – miloxe

0
SELECT i.*, mima.mi, mima.ma 
FROM item i 
JOIN (
     SELECT DISTINCT item_id 
     , MIN(ts) as mi 
     , MAX(ts) as ma 
     FROM item_data 
     GROUP BY item_id 
     ) mima ON mima.item_id = i.id 
WHERE i.type = 'X' 
     ; 

而且,是的:您的查詢就會從索引

CREATE INDEX ON item_data(item_id,ts); 
+0

WHERE I.TYPE ='X'is missing in your answer – miloxe

+0

I see .... *編輯* – joop

+0

我很抱歉,但您的解決方案比我原來的帖子慢了5000倍,即使索引片段切換了您的方式建議。 – miloxe

相關問題