[英]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.