如何加速Oracle大批量数据处理

一、提高DML操作的办法:

  简单说来:

  1、暂停索引,更新后恢复.避免在更新的过程中涉及到索引的重建.

  2、批量更新,每更新一些记录后及时进行提交动作.避免大量占用回滚段和或临时表空间.

  3、创建一临时的大的表空间用来应对这些更新动作.

  5、加大排序缓冲区

  alter session set sort_area_size=100000000;

  insert into tableb select * from tablea;

  commit;

  如果UPDATE的是索引字段,就会涉及到索引的重建,暂停索引不会提高多少的速度,反而有可能降低UPDATE速度,

  因为在更新是索引可以提高数据的查询速度,重建索引引起的速度降低影响不大。

  ORACLE优化修改参数最多也只能把性能提高15%,大部分都是SQL语句的优化!

  update总体来说比insert要慢 :

  几点建议:

  1、如果更新的数据量接近整个表,就不应该使用index而应该采用全表扫描

  2、减少不必要的index,因为update表通常需要update index

  3、如果你的服务器有多个cpu,采用parellel hint,可以大幅度的提高效率

  另外,建表的参数非常重要,对于更新非常频繁的表,建议加大PCTFREE的值,以保证数据块中有足够的空间用于UPDATE, 从而降低CHAINED_ROWS。

  二、各种批量DML操作:

  (1)、oracle批量拷贝:

  set arraysize 20

  set copycommit 5000

  copy from username/password@oraclename append table_name1

  using select * from table_name2;

      (2 )、常规插入方式:

          insert into t1 select * from t;

           为了提高速度可以使用下面方法,来减少插入过程中产生的日志:

           alter table t1 nologging;

insert into t1 select * from t;

commit;

      (3)、CTAS方式:

            create table t1

as
select * from t;

为了提高速度可以使用下面方法,来减少插入过程中产生的日志,并且可以制定并行度:

create table t1 nologging parallel(degree 2) as select * from t;

     (4)、Direct-Path插入:

          insert /*+append*/ into t1 select * from t;

          commit;

          为了提高速度可以使用下面方法,来减少插入过程中产生的日志:

          alter table t1 nologging;

          insert /*+append*/ into t1 select * from t;

 

          Direct-Path插入特点:

1、          append 只在 insert … select … 中起作用,像 insert /*+ append */ into t values(…) 这类的语句是不起作用的。在 update 、 delete 操作中, append 也不起作用。

2、 Direct-Path 会使数据库不记录直接路径导入的数据的重做日志,会对恢复带来麻烦。

3、 Direct-Path 直接在表段的高水位线以上的空白数据块中写数据,不会重用高水位线以下的空间,会对空间的使用造成一定的浪费,对查询的性能也会造成一定的影响。而常规插入会优先考虑使用高水位线之下有空闲空间存在的数据块。因此理论上 Direct-Path 插入会比常规插入速度更快,因为 Direct-Path 直接使用新数据块,而常规插入要遍历 freelist 获取可用空闲数据块,如果 同 nologging 配合,这种速度优势会更加明显。

4、 以 append 方式插入记录后,要执行 commit ,才能对表进行查询。否则会出现错误: ORA-12838: 无法在并行模式下修改之后读 / 修改对象。

5、 用 append 导入数据后,如果没有提交或者回滚,在其他会话中任何对该表的 DML 都会被阻塞(不会报错),但对该表的查询可以正常执行。

6、 在归档模式下,要把表设置为 nologging ,然后以 append 方式批量添加记录,才会显著减少 redo 数量。在非归档模式下,不必设置表的 nologging 属性,即可减少 redo 数量。如果表上有索引,则 append 方式批量添加记录,不会减少索引上产生的 redo 数量,索引上的 redo 数量可能比表的 redo 数量还要大。

7、 数据直接插入数据文件,绕过 buffer cache 并且忽略了引用完整性约束。

8、 不管表是否在 nologging 下,只要是 direct  insert ,就不会对数据内容生成 undo 。

9、 Oracle 在 Direct-Path INSERT 操作末尾,对具有索引的表执行索引维护,这样就避免了在 drop 掉索引后,再 rebuild 。

10、        Direct-Path INSERT比常规的插入需要更多的空间。因为它将数据插入在高水位之上。并行插入非分区表需要更多的空间,因为它需要为每一个并行线程创建临时段。

11、        在插入期间,数据库在表上获得排他锁,用户不能在表上执行并行插入、更新或者删除操作,并行的索引创建和build也不被允许。但却可以并行查询,但查询返回的是插入之前的结果集 。

  (5)、并行DML:

     如果你的服务器有多个cpu ,采用parellel hint ,可以大幅度的提高效率
      ALTER SESSION ENABLE PARALLEL DML;

     INSERT /*+ PARALLEL (tableA, 2) */INTO tableA
     SELECT * FROM tableB;

     为了提高速度可以使用下面方法,来减少插入过程中产生的日志:

  INSERT /*+ PARALLEL (tableA, 2) */INTO tableA NOLOGGING
     SELECT * FROM tableB;

oracle 默认并不会打开PDML ,对DML 语句必须手工启用。即需要执行

alter table enable parallel dml 命令。

 

并行DML 特点:

1 、在并行DML模式中,默认的就是DIRECT-PATH插入,为了运行并行DML模式,必须满足以下条件:

a、必须是Oracle企业版;

b、必须在session中使并行DML生效,执行以下sql语句:

ALTER SESSION { ENABLE | FORCE } PARALLEL DML;

c、必须指定table的并行属性,在创建的时候或者其他时候,或者在insert操作时使用“PARALLEL”提示。

d、为了使Direct-Path Insert模式失效,在INSERT语句中指定“NOAPPEND”提示,覆盖并行DML模式。

    2 、并行Direct-Path INSERT到分区表:

       类似于serial Direct-Path INSERT,每个并行操作分配给一个或者多个分区,每个并行操作插入数据到各自的分区段的高水位标志之上,commit之后,用户就能看到更新的数据。

    3、并行Direct-Path INSERT到非分区表:

        每个并行执行分配一个新的临时段,并插入数据到临时段。当commit运行后,并行执行协调者合并新的临时段到主表段,用户就能看到更新的数据。

    4、Direct-Path INSERT可以使用Log或者不使用Log。

    5、另外不得不说的是,并行不是一个可扩展的特性,只有在数据仓库或作为DBA 等少数人的工具在批量数据操作时利于充分利用资源,而在OLTP 环境下使用并行需要非常谨慎。事实上PDML 还是有比较多的限制的,例如不支持触发器,引用约束,高级复制和分布式事务等特性,同时也会带来额外的空间占用,PDDL 同 样是如此。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值