我有2個刪除語句需要很長時間才能完成。 where子句中的列有幾個索引。優化dup刪除語句Oracle
什麼是重複? 如果2個或更多記錄在列id,cid,type,trefid或ordrefid,amount和paydt中具有相同的值,則會有重複項。
刪除約100萬條記錄。
它們可以以任何方式重寫以使其更快。
DELETE FROM TABLE1 A WHERE loaddt < (
SELECT max(loaddt) FROM TABLE1 B
WHERE
a.id=b.id and
a.cid=b.cid and
NVL(a.type,'-99999') = NVL(b.type,'-99999') and
NVL(a.trefid,'-99999')=NVL(b.trefid,'-99999') and
NVL(a.ordrefid,'-99999')= NVL(b.ordrefid,'-99999') and
NVL(a.amount,'-99999')=NVL(b.amount,'-99999') and
NVL(a.paydt,TO_DATE('9999-12-31','YYYY-MM-DD'))=NVL(b.paydt,TO_DATE('9999-12-31','YYYY-MM-DD'))
);
COMMIT;
DELETE FROM TABLE1 a where rowid > (
Select min(rowid) from TABLE1 b
WHERE
a.id=b.id and
a.cid=b.cid and
NVL(a.type,'-99999') = NVL(b.type,'-99999') and
NVL(a.trefid,'-99999')=NVL(b.trefid,'-99999') and
NVL(a.ordrefid,'-99999')= NVL(b.ordrefid,'-99999') and
NVL(a.amount,'-99999')=NVL(b.amount,'-99999') and
NVL(a.paydt,TO_DATE('9999-12-31','YYYY-MM-DD'))=NVL(b.paydt,TO_DATE('9999-12-31','YYYY-MM-DD'))
);
commit;
解釋計劃:
DELETE TABLE1
HASH JOIN 1296491
Access Predicates
AND
A.ID=ITEM_1
A.CID=ITEM_2
ITEM_3=NVL(TYPE,'-99999')
ITEM_4=NVL(TREFID,'-99999')
ITEM_5=NVL(ORDREFID,'-99999')
ITEM_6=NVL(AMOUNT,(-99999))
ITEM_7=NVL(PAYDT,TO_DATE(' 9999-12-31 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))
Filter Predicates
LOADDT<MAX(LOADDT)
TABLE ACCESS TABLE1 FULL 267904
VIEW VW_SQ_1 690385
SORT GROUP BY 690385
TABLE ACCESS TABLE1 FULL 267904
究竟是什麼時間?你真正的問題是你不知道你在刪除過程中的位置(%完成)?另外,您在#2中的rowid的目標邏輯是什麼? – tbone
長時間= 15小時。我真的想減少刪除重複項所需的時間。我們每週都會加載新數據並刪除前幾周的重複記錄,因此在#2中,如果條件(where子句)匹配但rowid較小,我們將嘗試刪除記錄。較低的rowid與前一週插入的記錄相關聯。希望我在這裏有道理。 – Ram
什麼是重複?如果2列或更多記錄在列id,cid,type,trefid或ordrefid,amount和paydt中具有相同的值,則會有重複。 – Ram