2013-12-11 64 views
0

我有兩個表TABLEA(33M記錄)和tableB的(270K記錄), 我想刪除TableA中的所有記錄也存在TableB中。所以在下面寫一個SQL語句。 我認爲它應該被修改,因爲它表超過1小時將其全部刪除。 如果這種手術通常會有,你有沒有想法? 注意:兩個表的主鍵都是id。的Oracle SQL刪除操作的性能

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 |                                                 
--------------------------------------------------------------------------------------------------- 
+3

請張貼的「解釋計劃<你的delete語句」的結果,並從「選擇表(DBMS_XPLAN.DISPLAY)*」 –

+0

更新的問題,增加解釋的SQL語句的結果。 –

+0

閱讀:[存在X in向湯姆(http://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:953229842074) –

回答

1

這是一個有趣的執行計劃。您不會經常看到合併連接,因爲它們通常首先需要一種數據類型,但在這種情況下,只需要對一個數據集進行排序,因爲它通過索引快速全掃描(返回未分類數據)而不是索引來訪問全面掃描。

大部分成本都與通過索引完整掃描讀取SYS_C0015397索引有關,我猜測優化程序已經完成了一對快速完整掃描和散列連接並拒絕它的算法。不過,我想看看有沒有什麼可以與暗示:

delete /*+ no_use_merge(tablea) */ from ... 

我不知道這是足以讓一個哈希聯接,但看看說明計劃試圖比合並連接有其他的東西。

tablea上的連接列是唯一的還是PK?

0

使用存在或插入保存的數據插入到新表(B),刪除舊錶(A),並重新命名新表(B)爲表(一個)。