首页 > 解决方案 > Oracle group by 和 OR 查询优化

问题描述

SELECT BATCH_ID,
  BU_CODE,
  BU_TYPE,
  BATCH_TYPE,
  BATCH_GROUP_ID,
  STATUS,
  UPD_DTIME
FROM BATCH_T
WHERE (BU_CODE, BU_TYPE, BATCH_TYPE, UPD_DTIME) IN
  (SELECT BU_CODE,
    BU_TYPE,
    BATCH_TYPE,
    MAX(UPD_DTIME)
  FROM BATCH_T
  WHERE STATUS = 'CLOSED'
  GROUP BY BU_CODE,
    BU_TYPE,
    BATCH_TYPE
  )
OR UPD_DTIME >= SYSDATE - 5;

如上面没有 OR 条件的 Oracle Query 它给出快速响应,但有 OR 条件它需要这么多时间。您能否帮助如何提高上述查询的响应时间。

标签: sqloracleoracle12c

解决方案


您需要最后关闭的记录以及过去五天的所有内容。使用窗口函数!

SELECT b.*
FROM (SELECT b.*,
             ROW_NUMBER() OVER (PARTITION BY BU_CODE, BU_TYPE, BATCH_TYPE, STATUS ORDER BY UPD_DTIME DESC) as seqnum
      FROM BATCH_T b
     ) b
WHERE UPD_DTIME >= SYSDATE - 5 OR
      (STATUS = 'CLOSED' AND seqnum = 1);

这应该比使用IN/EXISTS和聚合的任何方法都快。写起来也比较简单。


推荐阅读