rownum条件对delete操作的影响

在一次偶然的测试中,发现在delete时如果加了rownum条件且走的是索引扫描,资源消耗及耗时都会增加,如果简单的测试:
sys@EBANK>truncate table test;
Table truncated.
sys@EBANK>truncate table test1;
Table truncated.
sys@EBANK>insert into test select * from dba_objects;
9538 rows created.
Commit complete.
sys@EBANK>insert into test1 select * from dba_objects;
9538 rows created.
Commit complete.
sys@EBANK>set autot traceonly
sys@EBANK>delete /*+ index(test idx_test) */ from test
  2  where
  3   object_id>0
  4  ;
9538 rows deleted.

Execution Plan
----------------------------------------------------------
Plan hash value: 3653239009
------------------------------------------------------------------------------
| Id  | Operation         | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------
|   0 | DELETE STATEMENT  |          | 38152 |   149K|    81   (0)| 00:00:01 |
|   1 |  DELETE           | TEST     |       |       |            |          |
|*  2 |   INDEX RANGE SCAN| IDX_TEST | 38152 |   149K|    81   (0)| 00:00:01 |
------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("OBJECT_ID">0)

Statistics
----------------------------------------------------------
        217  recursive calls
      11073  db block gets
        107  consistent gets
          0  physical reads
    3600892  redo size
        922  bytes sent via SQL*Net to client
        975  bytes received via SQL*Net from client
          6  SQL*Net roundtrips to/from client
          2  sorts (memory)
          0  sorts (disk)
       9538  rows processed
sys@EBANK>delete /*+ index(test1 idx_test1) */ from test1  
  2  where
  3   object_id>0 and rownum<=9538;
9538 rows deleted.

Execution Plan
----------------------------------------------------------
Plan hash value: 313130856
--------------------------------------------------------------------------------
| Id  | Operation          | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------
|   0 | DELETE STATEMENT   |           |  9538 | 38152 |    81   (0)| 00:00:01 |
|   1 |  DELETE            | TEST1     |       |       |            |          |
|*  2 |   COUNT STOPKEY    |           |       |       |            |          |
|*  3 |    INDEX RANGE SCAN| IDX_TEST1 | 38162 |   149K|    81   (0)| 00:00:01 |
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - filter(ROWNUM<=9538)
   3 - access("OBJECT_ID">0)

Statistics
----------------------------------------------------------
        145  recursive calls
      30091  db block gets
         82  consistent gets
          0  physical reads
    5433148  redo size
        922  bytes sent via SQL*Net to client
        994  bytes received via SQL*Net from client
          6  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
       9538  rows processed
 
为了找到原因所在,进一步研究并做redo dump:
 
-----session 1:
sys@EBANK>truncate table test;
Table truncated.
sys@EBANK>truncate table test1;
Table truncated.
sys@EBANK>insert into test select * from dba_objects where rownum<=10;
10 rows created.
sys@EBANK>insert into test1 select * from dba_objects where rownum<=10;
10 rows created.
Commit complete.
sys@EBANK>delete /*+ index(test idx_test) */ from test
  2  where
  3   object_id>0;
10 rows deleted.
-------session 2:
sys@EBANK>alter system switch logfile;
System altered.
sys@EBANK>delete /*+ index(test1 idx_test1) */ from test1  
  2  where
  3   object_id>0 and rownum<=10
  4  ;
10 rows deleted.
sys@EBANK>alter system dump logfile '/home/db/oracle/oradata/ebank/redo02.log';
System altered.
sys@EBANK>alter system dump logfile '/home/db/oracle/oradata/ebank/redo03.log';
System altered.
========================================================================
查看redo dump内容: OP:11.3为Delete Single Row,OP:10.4为Delete Leaf Row
========================================================================
[ora10g@single udump]$ grep OP:11.3 ebank_ora_4945.trc|wc -l   ---此处为无rownum删除的redo日志dump文件
10
[ora10g@single udump]$ grep OP:10.4 ebank_ora_4945.trc|wc -l   ---此处为无rownum删除的redo日志dump文件
1
[ora10g@single udump]$ grep OP:11.3 ebank_ora_4950.trc|wc -l   ---此处为有rownum删除的redo日志dump文件
10
[ora10g@single udump]$ grep OP:10.4 ebank_ora_4950.trc|wc -l   ---此处为有rownum删除的redo日志dump文件
10
[ora10g@single udump]$ grep CHANGE ebank_ora_4945.trc  ----此处为无rownum条件的redo dump文件
CHANGE #1 MEDIA RECOVERY MARKER SCN:0x0000.00000000 SEQ:  0 OP:23.1
CHANGE #1 MEDIA RECOVERY MARKER SCN:0x0000.00000000 SEQ:  0 OP:23.1
CHANGE #1 MEDIA RECOVERY MARKER SCN:0x0000.00000000 SEQ:  0 OP:23.1
CHANGE #1 MEDIA RECOVERY MARKER SCN:0x0000.00000000 SEQ:  0 OP:23.1
CHANGE #1 TYP:2 CLS: 1 AFN:4 DBA:0x01000126 OBJ:10493 SCN:0x0000.003ebdae SEQ:  1 OP:11.3
CHANGE #2 TYP:0 CLS:49 AFN:5 DBA:0x01400029 OBJ:4294967295 SCN:0x0000.003ebca2 SEQ:  1 OP:5.2
CHANGE #3 TYP:0 CLS: 1 AFN:4 DBA:0x01000126 OBJ:10493 SCN:0x0000.003ebdbb SEQ:  1 OP:11.3
CHANGE #4 TYP:0 CLS: 1 AFN:4 DBA:0x01000126 OBJ:10493 SCN:0x0000.003ebdbb SEQ:  2 OP:11.3
CHANGE #5 TYP:0 CLS: 1 AFN:4 DBA:0x01000126 OBJ:10493 SCN:0x0000.003ebdbb SEQ:  3 OP:11.3
CHANGE #6 TYP:0 CLS: 1 AFN:4 DBA:0x01000126 OBJ:10493 SCN:0x0000.003ebdbb SEQ:  4 OP:11.3
CHANGE #7 TYP:0 CLS: 1 AFN:4 DBA:0x01000126 OBJ:10493 SCN:0x0000.003ebdbb SEQ:  5 OP:11.3
CHANGE #8 TYP:0 CLS: 1 AFN:4 DBA:0x01000126 OBJ:10493 SCN:0x0000.003ebdbb SEQ:  6 OP:11.3
CHANGE #9 TYP:0 CLS: 1 AFN:4 DBA:0x01000126 OBJ:10493 SCN:0x0000.003ebdbb SEQ:  7 OP:11.3
CHANGE #10 TYP:0 CLS: 1 AFN:4 DBA:0x01000126 OBJ:10493 SCN:0x0000.003ebdbb SEQ:  8 OP:11.3
CHANGE #11 TYP:0 CLS: 1 AFN:4 DBA:0x01000126 OBJ:10493 SCN:0x0000.003ebdbb SEQ:  9 OP:11.3
CHANGE #12 TYP:0 CLS:50 AFN:5 DBA:0x01400d4b OBJ:4294967295 SCN:0x0000.003ebca1 SEQ: 32 OP:5.1
CHANGE #13 TYP:0 CLS:50 AFN:5 DBA:0x01400d4b OBJ:4294967295 SCN:0x0000.003ebdbb SEQ:  1 OP:5.1
CHANGE #14 TYP:0 CLS:50 AFN:5 DBA:0x01400d4b OBJ:4294967295 SCN:0x0000.003ebdbb SEQ:  2 OP:5.1
CHANGE #15 TYP:0 CLS:50 AFN:5 DBA:0x01400d4b OBJ:4294967295 SCN:0x0000.003ebdbb SEQ:  3 OP:5.1
CHANGE #16 TYP:0 CLS:50 AFN:5 DBA:0x01400d4b OBJ:4294967295 SCN:0x0000.003ebdbb SEQ:  4 OP:5.1
CHANGE #17 TYP:0 CLS:50 AFN:5 DBA:0x01400d4b OBJ:4294967295 SCN:0x0000.003ebdbb SEQ:  5 OP:5.1
CHANGE #18 TYP:0 CLS:50 AFN:5 DBA:0x01400d4b OBJ:4294967295 SCN:0x0000.003ebdbb SEQ:  6 OP:5.1
CHANGE #19 TYP:0 CLS:50 AFN:5 DBA:0x01400d4b OBJ:4294967295 SCN:0x0000.003ebdbb SEQ:  7 OP:5.1
CHANGE #20 TYP:0 CLS:50 AFN:5 DBA:0x01400d4b OBJ:4294967295 SCN:0x0000.003ebdbb SEQ:  8 OP:5.1
CHANGE #21 TYP:0 CLS:50 AFN:5 DBA:0x01400d4b OBJ:4294967295 SCN:0x0000.003ebdbb SEQ:  9 OP:5.1
CHANGE #1 TYP:2 CLS: 1 AFN:4 DBA:0x0100011c OBJ:10492 SCN:0x0000.003ebdae SEQ:  1 OP:4.1
CHANGE #1 TYP:0 CLS:50 AFN:5 DBA:0x01400d4b OBJ:4294967295 SCN:0x0000.003ebdbb SEQ: 10 OP:5.1
CHANGE #2 TYP:0 CLS: 1 AFN:4 DBA:0x0100011c OBJ:10492 SCN:0x0000.003ebdbb SEQ:  1 OP:10.4

[ora10g@single udump]$ grep CHANGE ebank_ora_4950.trc  ----此处为加rownum条件的redo dump文件
CHANGE #1 TYP:0 CLS:50 AFN:5 DBA:0x01400d4b OBJ:4294967295 SCN:0x0000.003ebdbb SEQ: 11 OP:5.1
CHANGE #2 TYP:2 CLS: 1 AFN:4 DBA:0x01000116 OBJ:10495 SCN:0x0000.003ebdb2 SEQ:  1 OP:11.3
CHANGE #1 TYP:2 CLS: 1 AFN:4 DBA:0x0100013c OBJ:10494 SCN:0x0000.003ebdb2 SEQ:  1 OP:4.1
CHANGE #1 TYP:0 CLS:50 AFN:5 DBA:0x01400d4b OBJ:4294967295 SCN:0x0000.003ebdc2 SEQ:  1 OP:5.1
CHANGE #2 TYP:0 CLS: 1 AFN:4 DBA:0x0100013c OBJ:10494 SCN:0x0000.003ebdc3 SEQ:  1 OP:10.4
CHANGE #1 TYP:0 CLS:50 AFN:5 DBA:0x01400d4b OBJ:4294967295 SCN:0x0000.003ebdc3 SEQ:  1 OP:5.1
CHANGE #2 TYP:0 CLS: 1 AFN:4 DBA:0x01000116 OBJ:10495 SCN:0x0000.003ebdc2 SEQ:  1 OP:11.3
CHANGE #1 TYP:0 CLS:50 AFN:5 DBA:0x01400d4b OBJ:4294967295 SCN:0x0000.003ebdc3 SEQ:  2 OP:5.1
CHANGE #2 TYP:0 CLS: 1 AFN:4 DBA:0x0100013c OBJ:10494 SCN:0x0000.003ebdc3 SEQ:  2 OP:10.4
CHANGE #1 TYP:0 CLS:50 AFN:5 DBA:0x01400d4b OBJ:4294967295 SCN:0x0000.003ebdc3 SEQ:  3 OP:5.1
CHANGE #2 TYP:0 CLS: 1 AFN:4 DBA:0x01000116 OBJ:10495 SCN:0x0000.003ebdc3 SEQ:  1 OP:11.3
CHANGE #1 TYP:0 CLS:50 AFN:5 DBA:0x01400d4b OBJ:4294967295 SCN:0x0000.003ebdc3 SEQ:  4 OP:5.1
CHANGE #2 TYP:0 CLS: 1 AFN:4 DBA:0x0100013c OBJ:10494 SCN:0x0000.003ebdc3 SEQ:  3 OP:10.4
CHANGE #1 TYP:0 CLS:49 AFN:5 DBA:0x01400029 OBJ:4294967295 SCN:0x0000.003ebdbb SEQ:  1 OP:5.2
CHANGE #2 TYP:1 CLS:50 AFN:5 DBA:0x01400d4c OBJ:4294967295 SCN:0x0000.003ebdc3 SEQ:  1 OP:5.1
CHANGE #3 TYP:0 CLS: 1 AFN:4 DBA:0x01000116 OBJ:10495 SCN:0x0000.003ebdc3 SEQ:  2 OP:11.3
CHANGE #1 TYP:0 CLS:50 AFN:5 DBA:0x01400d4c OBJ:4294967295 SCN:0x0000.003ebdc3 SEQ:  2 OP:5.1
CHANGE #2 TYP:0 CLS: 1 AFN:4 DBA:0x0100013c OBJ:10494 SCN:0x0000.003ebdc3 SEQ:  4 OP:10.4
CHANGE #1 TYP:0 CLS:50 AFN:5 DBA:0x01400d4c OBJ:4294967295 SCN:0x0000.003ebdc3 SEQ:  3 OP:5.1
CHANGE #2 TYP:0 CLS: 1 AFN:4 DBA:0x01000116 OBJ:10495 SCN:0x0000.003ebdc3 SEQ:  3 OP:11.3
CHANGE #1 TYP:0 CLS:50 AFN:5 DBA:0x01400d4c OBJ:4294967295 SCN:0x0000.003ebdc3 SEQ:  4 OP:5.1
CHANGE #2 TYP:0 CLS: 1 AFN:4 DBA:0x0100013c OBJ:10494 SCN:0x0000.003ebdc3 SEQ:  5 OP:10.4
CHANGE #1 TYP:0 CLS:50 AFN:5 DBA:0x01400d4c OBJ:4294967295 SCN:0x0000.003ebdc3 SEQ:  5 OP:5.1
CHANGE #2 TYP:0 CLS: 1 AFN:4 DBA:0x01000116 OBJ:10495 SCN:0x0000.003ebdc3 SEQ:  4 OP:11.3
CHANGE #1 TYP:0 CLS:50 AFN:5 DBA:0x01400d4c OBJ:4294967295 SCN:0x0000.003ebdc3 SEQ:  6 OP:5.1
CHANGE #2 TYP:0 CLS: 1 AFN:4 DBA:0x0100013c OBJ:10494 SCN:0x0000.003ebdc3 SEQ:  6 OP:10.4
CHANGE #1 TYP:0 CLS:50 AFN:5 DBA:0x01400d4c OBJ:4294967295 SCN:0x0000.003ebdc3 SEQ:  7 OP:5.1
CHANGE #2 TYP:0 CLS: 1 AFN:4 DBA:0x01000116 OBJ:10495 SCN:0x0000.003ebdc3 SEQ:  5 OP:11.3
CHANGE #1 TYP:0 CLS:50 AFN:5 DBA:0x01400d4c OBJ:4294967295 SCN:0x0000.003ebdc3 SEQ:  8 OP:5.1
CHANGE #2 TYP:0 CLS: 1 AFN:4 DBA:0x0100013c OBJ:10494 SCN:0x0000.003ebdc3 SEQ:  7 OP:10.4
CHANGE #1 TYP:0 CLS:50 AFN:5 DBA:0x01400d4c OBJ:4294967295 SCN:0x0000.003ebdc3 SEQ:  9 OP:5.1
CHANGE #2 TYP:0 CLS: 1 AFN:4 DBA:0x01000116 OBJ:10495 SCN:0x0000.003ebdc3 SEQ:  6 OP:11.3
CHANGE #1 TYP:0 CLS:50 AFN:5 DBA:0x01400d4c OBJ:4294967295 SCN:0x0000.003ebdc3 SEQ: 10 OP:5.1
CHANGE #2 TYP:0 CLS: 1 AFN:4 DBA:0x0100013c OBJ:10494 SCN:0x0000.003ebdc3 SEQ:  8 OP:10.4
CHANGE #1 TYP:0 CLS:50 AFN:5 DBA:0x01400d4c OBJ:4294967295 SCN:0x0000.003ebdc3 SEQ: 11 OP:5.1
CHANGE #2 TYP:0 CLS: 1 AFN:4 DBA:0x01000116 OBJ:10495 SCN:0x0000.003ebdc3 SEQ:  7 OP:11.3
CHANGE #1 TYP:0 CLS:50 AFN:5 DBA:0x01400d4c OBJ:4294967295 SCN:0x0000.003ebdc3 SEQ: 12 OP:5.1
CHANGE #2 TYP:0 CLS: 1 AFN:4 DBA:0x0100013c OBJ:10494 SCN:0x0000.003ebdc3 SEQ:  9 OP:10.4
CHANGE #1 TYP:0 CLS:50 AFN:5 DBA:0x01400d4c OBJ:4294967295 SCN:0x0000.003ebdc3 SEQ: 13 OP:5.1
CHANGE #2 TYP:0 CLS: 1 AFN:4 DBA:0x01000116 OBJ:10495 SCN:0x0000.003ebdc3 SEQ:  8 OP:11.3
CHANGE #1 TYP:0 CLS:50 AFN:5 DBA:0x01400d4c OBJ:4294967295 SCN:0x0000.003ebdc3 SEQ: 14 OP:5.1
CHANGE #2 TYP:0 CLS: 1 AFN:4 DBA:0x0100013c OBJ:10494 SCN:0x0000.003ebdc3 SEQ: 10 OP:10.4
CHANGE #1 TYP:0 CLS:49 AFN:5 DBA:0x01400029 OBJ:4294967295 SCN:0x0000.003ebdc3 SEQ:  1 OP:5.4     
========
结论:对于不加rownum条件限制的delete操作,其删除动作是先删除了表里所有记录后,最后再一次性删除索引记录,而对于加rownum条件的delete操作,每删除表里的一条记录,同时删除
索引里的记录。显然,对于前者,oracle可以一次性把同一个索引块中的记录删除,只生产一条undo以及redo记录,而对于后者,对于每一条索引记录,oracle都要读取一次索引块,
并生成相应的undo和redo记录

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10972173/viewspace-683864/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10972173/viewspace-683864/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值