如何从另一个表中选择 MIN 和 MAX
Posted
技术标签:
【中文标题】如何从另一个表中选择 MIN 和 MAX【英文标题】:How to select MIN and MAX from another table 【发布时间】:2015-06-24 18:21:35 【问题描述】:我在 postgresql 中有两个表:ITEM (ID, TYPE) 和 ITEM_DATA (TS, ITEM_ID) 在 1:n 关系中。第一张桌子很小,第二张桌子很大。我想知道从表ITEM_DATA 中为从表ITEM 中选择的每一行选择最小值和最大值的最佳方法。目前我有这个选择,但是太慢了:
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,表 ITEM 上还有一个索引,它有一个段:TYPE。
有没有办法让这个查询更快?
【问题讨论】:
ITEM表有多少行,ITEM_DATA表有多少行? ITEM_DATA 上还有很多其他列吗? ITEM 有数百,ITEM_DATA 有数亿 【参考方案1】:我认为您应该颠倒 ITEM_DATA 上 PK 列的顺序。
【讨论】:
【参考方案2】: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);
【讨论】:
您的答案中缺少 I.TYPE = 'X' 很抱歉,即使索引段按照您建议的方式切换,您的解决方案也比我原来的帖子慢 5000 倍。i.type = 'X'
限制的选择性是什么?该计划显示了什么?什么是旅游数据库调优?你有有效的统计数据吗?以上是关于如何从另一个表中选择 MIN 和 MAX的主要内容,如果未能解决你的问题,请参考以下文章
如何使用第一个表中的逗号分隔值从另一个表中选择行? [复制]