[英]Oracle delete query taking long time to delete the records from the table
[英]Delete records with correlation query in Oracle
我有一張包含用戶和地址的表格。
我需要從多個不同用戶與同一地址關聯的表中刪除所有記錄。
因此,我准備了以下查詢:
DELETE FROM MYTABLE A
WHERE EXISTS (
SELECT USER_ID
FROM MYTABLE B
WHERE A.ADDRESS = B.ADDRESS AND B.USER_ID > A.USER_ID
)
我發現有時這個查詢掛起,而大多數時候它工作正常。 我懷疑這種掛起可能是由鎖引起的。
有人可以確認是否是這種情況嗎? 一般來說,這是實現 Oracle 中目標的有效方法嗎?
oracle 版本為 12.1。
謝謝,
這是一個有點長的評論。
1) 如果不提供額外數據,就不可能知道是什么導致了您所看到的速度緩慢。
2)但是,在刪除重復項時,通常在 Oracle 中具有良好性能的解決方案是使用帶ANY
的相關子查詢。 我會提倡以下查詢:
DELETE FROM MYTABLE A
WHERE A.USER_ID > ANY (SELECT USER_ID FROM MYTABLE B WHERE A.ADDRESS = B.ADDRESS)
對於此查詢(以及您的查詢),請考慮(USER_ID, ADDRESS )
上的索引。
如果要刪除所有重復的行,我可能會建議:
DELETE FROM MYTABLE A
WHERE A.ADDRESS IN (SELECT A2.ADDRESS
FROM MYTABLE A2
GROUP BY A2.ADDRESS
HAVING COUNT(DISTINCT A2.USER_ID) > 1
);
子查詢應該被評估一次。 (ADDRESS, USER_ID)
上的索引將有助於查詢。
如果您想保留最小用戶 ID(這不是您所說的,但似乎很合理),那么我建議:
DELETE FROM MYTABLE A
WHERE A.USER_ID > (SELECT MIN(A2.USER_ID)
FROM MYTABLE A2
WHERE A2.ADDRESS = A.ADDRESS
);
為此,相同的索引是有益的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.