2015-06-24 37 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

相关问题