一台服务器  想测试一下性能 
一张2亿条记录的表,该表有50个分区partition f1--f50 
想写个过程,对一下几个分区段并行一下  
  partition(f1)-----(f10) 
  partition(f11)------(f20) 
  partition(f21)------(f30) 
  partition(f31)------(f40) 
  partition(f51)------(f50) 
  全部插入到另一个表中。 什么是并行操作,,并行操作有什么优点!!! 给写段简单的代码也可以,,, 

解决方案 »

  1.   

    (1)、Oracle插入数据有两种方式:
    a、常规插入:重新使用table中的自由空间,在已有数据中插入新数据;维护引用完整性约束。
    b、Direct-Path插入:在表中已有数据之后插入新数据;数据直接插入数据文件,绕过buffer cache;已有数据中的自由空间没有被重新利用;忽略了引用完整性约束。 
    (2)、连续模式:一个进程执行sql语句;
    并行模式:多个进程同时执行一个sql语句,即并行执行。
    (3)Direct-Path插入的优点:
    1、可以disable redo log和undo log;而常规插入却不可以如此,并且重用自由空间和维护引用完整性。
    2、通过CREATE TABLE...AS SELECT 语句可以从现有表中创建新表,使用Direct-Path插入可以在插入时更新定义在目标表上的任意索引。
    3、Direct-Path插入能保证事务的原子性,即使在并行模式下。使用SQL*Loader在并行模式加载中不能保证原子性。
    4、当并行Direct-Path加载发生错误时,索引被标志成UNUSABLE。
    5、如果想使用表压缩的压缩格式存储数据,必须使用Direct-Path插入。
    (4)使用Direct-Path插入:
    在连续模式中,在Insert语句中指定“APPEND”提示,在INSERT关键字之后,或者在INSERT子查询中的SELECT关键字之后。
    在并行DML模式中,默认的就是DIRECT-PATH插入,为了运行并行DML模式,必须满足以下条件:
    a、必须是Oracle企业版;
    b、必须在session中使并行DML生效,执行以下sql语句:
    ALTER SESSION { ENABLE | FORCE } PARALLEL DML;
    c、必须指定table的并行属性,在创建的时候或者其他时候,或者在insert操作时使用“PARALLEL”提示。
    为了使Direct-Path Insert模式失效,在INSERT语句中指定“NOAPPEND”提示,覆盖并行DML模式。
    (5)、Direct-Path INSERT 是如何工作的
    在分区表和非分区表都可以使用Direct-Path INSERT
    连续Direct-Path INSERT到分区和非分区表
    单个进程插入数据到高水位标志之上,当执行完commit之后,高水位标志得到更新。
    并行Direct-Path INSERT到分区表
    类似于serial Direct-Path INSERT,每个并行操作分配给一个或者多个分区,每个并行操作插入数据到各自的分区段的高水位标志之上,commit之后,用户就能看到更新的数据。
    并行Direct-Path INSERT到非分区表
    每个并行执行分配一个新的临时段,并插入数据到临时段。当commit运行后,并行执行协调者合并新的临时段到主表段,用户就能看到更新的数据。
    为Direct-Path INSERT指定的Log模式
    Direct-Path INSERT可以使用Log或者不使用Log。
    (6)、其他需要注意的地方:
    索引维护:Oracle在Direct-Path INSERT 操作末尾,对具有索引的表执行索引维护,这样就避免了在drop掉索引后,再rebuild。
    使用的空间:Direct-Path INSERT比常规的插入需要更多的空间。因为它将数据插入在高水位之上。并行插入非分区表需要更多的空间,因为它需要为每一个并行创建临时段。
    锁:在插入期间,数据库在表上获得排他锁,用户不能在表上执行并行插入、更新或者删除操作,并行的索引创建和build也不被允许。但却可以并行查询,但查询返回的是插入之前的结果集。