2013-12-11 27 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)为表(一个)。