`
core_qq
  • 浏览: 15922 次
  • 性别: Icon_minigender_1
  • 来自: 西安
最近访客 更多访客>>
社区版块
存档分类
最新评论

有关nologging和append提高插入效率的研究

阅读更多

     那天接到一个事情,我们的数据库表空间已经快用完了,我们需要将一个3GB的表里的数据转储到历史表里去,3天干完。但是我们因为是给运营商服务的,所以白天是绝对不能做这个事情的,只能晚上干,这就要求我们必须尽可能的提高效率。有同事提议使用nologging和append提高效率,但是nologging和append是不是能够提高效率呢。我查询了官方文档,有这么一个描述:

 

   Conventional INSERT is the default in serial mode. In serial mode, direct path can be used only if you include the APPEND hint.

   Direct-path INSERT is the default in parallel mode. In parallel mode, conventional insert can be used only if you specify the NOAPPEND hint.

   In direct-path INSERT, data is appended to the end of the table, rather than using existing space currently allocated to the table. As a result, direct-path INSERT can be considerably faster than conventional INSERT.

 

 

     原来append模式的原理就是将数据直接插到表的最后,而不是插入到表的空闲空间中,这样从算法上讲,是一个很简单的算法,所以效率会提高不少。但是还是做个试验,验证一下吧。

     实验环境:windows7 x64,oracle11gR2,归档模式。

     实验一:append和nologging对insert的影响。

     1 建立试验用表。

      create table test1 as select * from dba_objects;

        2 记录现在系统中的redo size:

     select name, value from v$sysstat where name = 'redo size';

     现在系统的redo size为:915021984。

     3 普通模式插表,记录之后的redo size以及时间:

     insert into test1 (select * from dba_objects);

     commit;

     现在的redo size为:936621172

     耗用时间为:1.264秒

     这个操作产生的redo为:21599188

     4 drop掉试验表,重建该表,使用nologging hint,记录前后的redo size:

     insert /*+ nologging*/ into test1 (select * from dba_objects);

     commit;

         插入之前的redo size:953810184

    插入之后的redo size:962152616

    耗时:1.092秒

    这个操作产生的redo为:8342432。

    5 drop该表,重建之。以append hint插入:

    插入之前的redo size:997153368

    插入之后的redo size:1005655116

    耗时:1.014秒

    该操作产生的redo:8501748

    6 drop该表,重建之。将表调整为nologging模式,以append hint插入:

    alter table test1 nologging;

    insert /*+ append*/ into test1 (select * from dba_objects);

    commit;

    插入之前的redo size:988037948

    插入之后的redo size:988156952

    操作耗时:1.029秒

    这个操作产生的redo为:119004。

    实验一的总结:从第四步可以很明显的看出来,使用nologging hint插表,效率可以得到很大的提升,我这个试验表比较小,在时间上还看不出明显的区别,但是如果放在生产环境上,从redo size的产生情况就可以看出,nologging模式对效率的提升应该是非常可观的。从第五步就能看出,使用append hint也可以很好的提升效率。但是,如果nologging和append一起使用,效果更好,产生的redo比之前述两种更是少了一个数量级,比直接插入少了两个数量级。不过,在实际的生产环境中,表的模式不能随意更改,因此有时候也只能使用nologging模式来做最可能的性能优化。

    任何性能的提升总要有一定的牺牲。如果append hint能很好的提高效率,为什么oracle不会直接默认就选择它?这个问题依我浅见,应该是担心产生磁盘碎片。虽说以后的插入会使用现有的空闲空间,但是我估计这种操作会产生碎片的概率要远远高于普通插入。具体的资料我还没有找到,如果找到了,一定即使在这里说。

    如果各位能够给我讲解一二,小弟不胜荣幸。

分享到:
评论

相关推荐

    Oracle插入大量数据

    当面对大量数据的插入操作时,如何优化这一过程,减少系统负担,提高数据处理效率,成为了一个重要的议题。根据给定文件的信息,“Oracle插入大量数据”的主题围绕着几种有效的策略展开,旨在提升Oracle数据库在大...

    Oracle 大数据量操作优化.pdf

    4. **调整排序缓冲区大小**:通过`ALTER SESSION SET SORT_AREA_SIZE`命令增大排序缓冲区的大小,可以提高数据插入和排序操作的效率,尤其是在执行大规模INSERT INTO...SELECT语句时。 5. **减少不必要的索引**:...

    Oracle 大数据量操作优化

    - Direct-Path插入是一种特殊的数据加载机制,它可以极大地提高插入性能。 - 特点包括: - 只适用于`INSERT...SELECT`语句。 - 不记录重做日志,有助于减少恢复时的工作量。 - 直接在表段的高水位线以上写入...

    IT服务支撑人员招聘试题(2021年)含答案.docx

    - 插入速度提升可以通过删除索引、并行插入、使用APPEND方式和关闭Nologging来实现。 - 对于MAX查询,为OBJECT_ID列建立索引可以使用INDEX FULL SCAN (MIN/MAX)提高性能。 - 外键未建索引可能导致死锁,影响查询...

    insert大量数据经验之谈

    1. 使用`NOLOGGING`和`APPEND` Hint: ```sql ALTER TABLE tab1 NOLOGGING; INSERT /*+ APPEND */ INTO tab1 SELECT * FROM tab2; COMMIT; ALTER TABLE tab1 LOGGING; ``` 这种方法减少了归档日志的生成,加快了插入...

    ORACLE SQL-UPDATE、DELETE、INSERT优化和使用技巧分享

    1. **禁用redo log**:为了提高插入速度,可以临时禁用重做日志(ALTER TABLE <TABLENAME> NOLOGGING;),但需要注意,这样可能会丢失部分事务信息,需要谨慎操作。 2. **APPEND hint**:使用`/*+ APPEND */`暗示,...

    ORACLE批量更新四种方法.txt ORACLE批量更新四种方法.txt

    ### Oracle 批量更新四种方法详解 #### 一、背景介绍 在数据库管理与应用开发过程中,经常...同时,考虑到Oracle数据库的特点,合理利用其提供的各种工具和技术手段,能够在很大程度上提升批量更新的效率和稳定性。

Global site tag (gtag.js) - Google Analytics