簡體   English   中英

Oracle SQL刪除操作性能

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM