ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Rollback&Truncate操作对高水位线影响之性能优化篇

Rollback&Truncate操作对高水位线影响之性能优化篇

Linux操作系统 作者:zqg_1st 时间:2014-03-21 16:54:42 0 删除 编辑

引题:受人之托,写了这篇文章,貌似这个问题也困扰了许多人,希望可以给大家一点启发

Test

1.     创建一个用户leonarding并授予dba权限

SYS@LEO> create user leonarding identified by leonarding default tablespace users;

SYS@LEO> grant dba to leonarding;

2.     创建一个t表,只要结构信息

SYS@LEO> conn leonarding/leonarding

LEONARDING@LEO> create table t as select * from all_objects where 1=0;

Table created.

3.     启动执行计划,查看统计报告

LEONARDING@LEO> set autotrace on;

LEONARDING@LEO> select * from t;

no rows selected

Execution Plan  执行计划

----------------------------------------------------------

Plan hash value: 1601196873

--------------------------------------------------------------------------

| Id  | Operation              | Name | Rows  | Bytes | Cost (%CPU)| Time     |

--------------------------------------------------------------------------

|   0 | SELECT STATEMENT  |      |     1 |   128 |     2   (0)| 00:00:01 |

|   1 |  TABLE ACCESS FULL| T    |     1 |   128 |     2   (0)| 00:00:01 |  全表扫描

--------------------------------------------------------------------------

Note

-----

   - dynamic sampling used for this statement

Statistics      统计报告

----------------------------------------------------------

        264  recursive calls

          0  db block gets

         30  consistent gets    一致性读,I/O数量

          0  physical reads

          0  redo size

        995  bytes sent via SQL*Net to client

        370  bytes received via SQL*Net from client

          1  SQL*Net roundtrips to/from client

          0  sorts (memory)

          0  sorts (disk)

          0  rows processed

LEONARDING@LEO>

4.     关闭执行计划

LEONARDING@LEO> set autotrace off;

5.     向表t插入记录但不提交

LEONARDING@LEO> insert into t select * from all_objects;    已经插入9681row

9681 rows created.

LEONARDING@LEO> select count(*) from t;                 此时表中已经有9681行数据了

  COUNT(*)

----------------------------

      9681

6.     Rollback回滚操作

LEONARDING@LEO> rollback;

Rollback complete.

LEONARDING@LEO> select count(*) from t;                此时表中为0

  COUNT(*)

------------------

         0

7.     第二次查询表t统计报告

LEONARDING@LEO> set autotrace traceonly statistics;

LEONARDING@LEO> select * from t;

no rows selected

Statistics

----------------------------------------------------------

          0  recursive calls

          0  db block gets

        141  consistent gets       一致性读,I/O数量明显上升

          0  physical reads

          0  redo size

        995  bytes sent via SQL*Net to client

        370  bytes received via SQL*Net from client

          1  SQL*Net roundtrips to/from client

          0  sorts (memory)

          0  sorts (disk)

          0  rows processed

说明:

我们可以看出第二次一致性读I/O数量明显高过了第一次I/O数量,我说明一下流程大家就都明白了,当我们insert插入大量数据的时候oracle已经预先分配块空间,此时HWM已经上浮(注:我们检索HWM以下的块)。虽然我们又做了rollback操作,但rollback只是回滚undo快照并没有重设HWM功能,那么块空间还是存在的只不过为空。select 扫描HWM以下的块,当然也包括了这些空块,增加了一致性读I/O次数,所以一致性读I/O30上升到141,多出来的111就是扫描这些空块。下面我们来看看truncate操作对HWM影响

8.     truncate操作对HWM影响

LEONARDING@LEO> insert into t select * from all_objects;

9681 rows created.

Statistics

----------------------------------------------------------

          8  recursive calls

        923  db block gets

      16277  consistent gets          插入时就已经分配了块空间,HWM上浮

          0  physical reads

     976484  redo size

        674  bytes sent via SQL*Net to client

        571  bytes received via SQL*Net from client

          4  SQL*Net roundtrips to/from client

          1  sorts (memory)

          0  sorts (disk)

       9681  rows processed

LEONARDING@LEO> commit;        

Commit complete.

LEONARDING@LEO> truncate table t;

Table truncated.

LEONARDING@LEO> select * from t;

no rows selected

Statistics

----------------------------------------------------------

          1  recursive calls

          1  db block gets

          6  consistent gets        明显降低了一致性读I/O数量,说明truncate操作能够有效降低HWM并且不会生成undo信息

          0  physical reads

         96  redo size

        995  bytes sent via SQL*Net to client

        370  bytes received via SQL*Net from client

          1  SQL*Net roundtrips to/from client

          0  sorts (memory)

          0  sorts (disk)

          0  rows processed

小结:当我们在删除一个表中所有记录时,如果想有效降低I/O开销,那么可以直接使用truncate方式,但注意此方式不能生成undo信息恢复成本较高谨慎操作。

Leonarding

2012.6.10

天津&summer

Bloghttp://space.itpub.net/26686207

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

请登录后发表评论 登录
全部评论

注册时间:2013-09-04

  • 博文量
    24
  • 访问量
    76933