Oracle DELETE破坏了TEMP空间

时间:2016-04-25 22:26:21

标签: oracle sql-delete oracle12c sqlperformance

我有一张170亿行的表。我想删除其中一些,存在于另一个表中。

我尝试了一个并行化的删除语句,因为临时空间不够而无法完成。

delete /* + PARALLEL(a, 32) */
  from a
 where (a.key1, a.key2) in
         (select /*+ PARALLEL(b, 16) */
                 key1,
                 key2
            from b);

然后我尝试创建表格作为选择,因为同样的原因也失败了。

create table a_temp parallel 32 nologging as
       select /* + PARALLEL (a, 32) */
              key1,
              key2,
              rest_of_data
         from a
        where (a.key1, a.key2) not in
                (select key1, key2 from b);

常规(没有PARALLEL)删除时间超过一天所以我不得不终止它。

有没有办法释放临时空间,因为在删除执行期间不再需要它?

我还有其他办法吗?

编辑: B有1.73亿条记录,必须删除近160亿条记录(几乎整个表格)。桌子上没有索引。

EDIT2: create table的解释计划如下:

CREATE TABLE STATEMENT, GOAL = ALL_ROWS         6749420 177523935   10828960035
 PX COORDINATOR                 
  PX SEND QC (RANDOM)   SYS :TQ10001    6740915 177523935   10828960035
   LOAD AS SELECT (HYBRID TSM/HWMB) USER    A_TEMP          
    OPTIMIZER STATISTICS GATHERING          6740915 177523935   10828960035
     MERGE JOIN ANTI NA         6740915 177523935   10828960035
      SORT JOIN         6700114 17752393472 745600525824
       PX BLOCK ITERATOR            45592   17752393472 745600525824
        TABLE ACCESS FULL   USER    A   45592   17752393472 745600525824
      SORT UNIQUE           40802   173584361   3298102859
       PX RECEIVE           5365    173584361   3298102859
        PX SEND BROADCAST   SYS :TQ10000    5365    173584361   3298102859
         PX BLOCK ITERATOR          5365    173584361   3298102859
          TABLE ACCESS FULL USER    B   5365    173584361   3298102859

提前致谢

2 个答案:

答案 0 :(得分:0)

为了解决这个问题,我一次批量删除了〜1M。经过大量挖掘更清洁的解决方案后,DBA坚持采用这种方法。

这是我的工作流程:

我使用Python和cx_Oracle模块读取待删除记录的PK值,迭代地将它们作为绑定变量插入到executemany调用中,并在每次迭代后提交。

如果您想坚持并行执行方法: 请记住使用ALTER SESSION ENABLE PARALLEL DML,以便并行执行合并或删除。看看这篇精彩的博客文章,它将引导您完成此操作: https://dioncho.wordpress.com/2010/12/10/interpreting-parallel-merge-statement/

答案 1 :(得分:0)

我使用不同的解决方案使其成功。

我手动创建了insert表,并使用APPEND PARALLEL提示进行了create table a_temp(..); insert /* + APPEND PARALLEL(a_temp, 32) */ into a_temp(...) select /* + PARALLEL(a, 32) */ (...) from a where not exists (select /* + PARALLEL(b, 16) */ '1' from b where a.key1 = b.key1 and a.key2 = b.key2) 。没有超出温度空间,插件表现完美。

以下是代码:

dateFormat