【问题标题】:How to select MIN and MAX from another table如何从另一个表中选择 MIN 和 MAX
【发布时间】: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 有数亿

标签: sql postgresql select query-optimization


【解决方案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' 限制的选择性是什么?该计划显示了什么?什么是旅游数据库调优?你有有效的统计数据吗?
    猜你喜欢
    • 1970-01-01
    • 2014-05-22
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多