[英]Oracle SQL Delete Operation Performance
我有兩個表tableA(33M條記錄)和tableB(270K條記錄),我想刪除tableA中也存在於tableB中的所有記錄。 因此,在下面編寫一條SQL語句。 我認為應該對其進行修改,因為它已將表刪除了1個多小時。 您是否知道這種操作是否常用。 注意:兩個表的主鍵都是id。
delete from tableA where id in (select id from tableB);
這是sql語句的解釋
| 0 | DELETE STATEMENT | | 289K| 7341K| | 85624 (1)| 00:17:08 |
| 1 | DELETE | tableA | | | | | |
| 2 | MERGE JOIN | | 289K| 7341K| | 85624 (1)| 00:17:08 |
| 3 | INDEX FULL SCAN | SYS_C0015397 | 36M| 455M| | 84050 (1)| 00:16:49 |
|* 4 | SORT JOIN | | 289K| 3670K| 11M| 1574 (1)| 00:00:19 |
| 5 | INDEX FAST FULL SCAN| SYS_C0015401 | 289K| 3670K| | 193 (2)| 00:00:03 |
---------------------------------------------------------------------------------------------------
那是一個有趣的執行計划。 您不會經常看到合並聯接,因為它們通常首先需要某種數據,但是在這種情況下,只需要對一個數據集進行排序,因為它是通過索引快速完整掃描(返回未排序的數據)而不是索引來訪問的。全面掃描。
大部分成本與通過索引完全掃描讀取SYS_C0015397索引有關,我猜想優化器已經完成了一對快速完整掃描和哈希聯接的算法,並拒絕了它。 不過,我想看看是否可以暗示:
delete /*+ no_use_merge(tablea) */ from ...
我不確定這是否足以實現哈希聯接,但是請查看說明計划是否嘗試了除合並聯接之外的其他操作。
tablea上的連接列是唯一的還是PK?
使用存在的數據或將保存的數據插入新表(B),刪除舊表(A)並將新表(B)重命名為表(A)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.