简体   繁体   English

Oracle group by 和 OR 查询优化

[英]Oracle group by and OR query optimization

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;

As in above Oracle Query with out OR condition its giving quick response, But with OR condition its taking so much time.与上面的 Oracle Query 一样,在没有 OR 条件的情况下,它给出了快速响应,但是在 OR 条件下,它需要花费很多时间。 Can you please help how to improve the response time of above query.您能否帮助提高上述查询的响应时间。

You want the last closed record and everything from the last five days.您需要最后关闭的记录以及过去五天的所有内容。 Use window functions!使用窗口函数!

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);

This should be faster than any method using IN / EXISTS and aggregation.这应该比使用IN / EXISTS和聚合的任何方法都快。 It is also simpler to write.写起来也比较简单。

Split the query in such a way that, there should be AND condition in it to get the performance gain as like below.以这样的方式拆分查询,其中应该有AND条件以获得如下所示的性能增益。

 SELECT BATCH_ID,
  BU_CODE,
  BU_TYPE,
  BATCH_TYPE,
  BATCH_GROUP_ID,
  STATUS,
  UPD_DTIME
FROM BATCH_T
WHERE UPD_DTIME >= SYSDATE - 5

UNION ALL

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
  ) AND NOT UPD_DTIME >= SYSDATE - 5;

您可以为 UPD_DTIME 创建索引

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM