[英]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;
與上面的 Oracle Query 一樣,在沒有 OR 條件的情況下,它給出了快速響應,但是在 OR 條件下,它需要花費很多時間。 您能否幫助提高上述查詢的響應時間。
您需要最后關閉的記錄以及過去五天的所有內容。 使用窗口函數!
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
和聚合的任何方法都快。 寫起來也比較簡單。
以這樣的方式拆分查詢,其中應該有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.