最近系统割接..
需要将老系统的数据导入到中间表里去..
基本语句为..
insert into 中间表(字段1,字段2,字段3,字段4) 
select  /*+parallel (t, 6)+*/ 字段1,字段2,字段3,字段4 from 老系统表 t;
在这里我发现导入的速度比较的慢.
我对这个 /*+parallel (t, 6)+*/ 也不是很了解
查过资料后依稀明白了一点点..但是资料都不是很全...对于介绍 /*+parallel (t, 6)+*/
在各大论坛唯一能搜索到的一个帖子就是
-------------------------------------------------------------------------------------------------------------
类似如下的一条语句:insert into xxxx select /*+parallel(a) */ * from xxx a;数据量大约在75G左右,
这位兄弟从上午跑到下午还没跑完,过来问我咋回事,说平常2hrs能跑完的东西跑了好几个小时还撒动静。
查看系统性能也比较 正常,cpu,io都不繁忙,平均READ速度在80M/s左右(勉强凑合),但平均写速度只有10M不到。
等待事件里面大量的‘ ‘PX Deq Credit: send blkd’,这里能看出并行出了问题,从而最后得知是并行用法有问题,
修改之后20分钟完成了该操作。正确的做法应该是:
alter session enable dml parallel;insert /*+parallel(xxxx,4) */ into xxxx select /*+parallel(a) */ * from xxx a;因为oracle默认并不会打开PDML,对DML语句必须手工启用。 另外不得不说的是,并行不是一个可扩展的特性,只有在
数据仓库或作为DBA等少数人的工具在批量数据操作时利于充分利用资源,而在OLTP环境下使用并行 需要非常谨慎。
事实上PDML还是有比较多的限制的,例如不支持触发器,引用约束,高级复制和分布式事务等特性,同时也会带来额外
的空间占用,PDDL同 样是如此。有关Parallel excution可参考官方文档,在Thomas Kyte的新书《Expert Oracle 
Database architecture》也有精辟的讲述。
-------------------------------------------------------------------------------------------------------------
我对上面的帖子有点疑问?
insert /*+parallel(xxxx,4) */ into xxxx select /*+parallel(a) */ * from xxx a;
这个语句是不是是这个意思
insert /*+parallel(中间表,4) */ into 中间表 select /*+parallel(a) */ * from 老表 a;还有谁能详细解释一下/*+parallel(中间表,4) */ 是什么意思...
为什么用下面的写法就快了...

解决方案 »

  1.   

    表示并行度为4/*+parallel(中间表,4) */,一般用于多CPU的数据库,可以大幅度提高查询速度。
    一般来说可以直接针对session开并行度:
      ALTER SESSION FORCE PARALLEL query PARALLEL 10;  --表示select语句的并行度为10
      ALTER SESSION FORCE PARALLEL DML PARALLEL 10;    --表示delete,update,insert操作的并行度为10insert /*+parallel(中间表,4) */ into 中间表 select /*+parallel(a,5) */ * from 老表 a; 
    这里表示insert并行度为4,select的并行度为5。对于并行写的表必须要提交事务了才能对该表进行读或写,比如执行了上面的insert,那么如果不commit或rollback那么select * from 中间表就会报错。就我知道的描述了一下,希望对你有帮助。
      

  2.   

    /*+ */ 是Oracle 的Hint提示, 如/*+ index() */parallel 并行操作
    parallel(table,4) 并行度为4
    parallel(table)   如果使用parallel 但未指定并行度,则DOP要通过初始化参数CPU_count 和Parallel_THREADS_PER_CPU计算得到,并行度为4的程序,最多可以分配或创建9个并行执行服务器来满足这个事务操作,所以并行操作速度有很大提高,但对CPU占用比较多并行操作增加了事务操作的性能,但会连续的记录重做日志,并且造成瓶颈,所以可以使用nologging 模式来避免瓶颈
    ql> alter   table   table_name   NOLOGGING;