数据库是11G,CPU 16个,内存50G, Win2003系统。用于数据仓库,经常需要由源表生成一些统计表,聚合表,源表数据量有一百亿,现在的问题插入数据超慢,我看CPU的使用率才百分之10几,内存最多用到40G,应该是磁盘IO的问题,V$SESSION_WAIT里有好多db file parallel read,db file parallel write,db file sequential read事件,但WAIT_TIME基本都是0。
DB_WRITER_PROCESSES 值为16,parallel_threads_per_cpu为2,应该是默认的,没改过。但是看资料说最好8个cpu对应1个db writer,那我这个DB_WRITER_PROCESSES应该设成2??
我的数据插入语句就2种:先建表再执行insert into .... select ...,还有一个是create table as select ....不知道这两种那种效率更高些?但是现在都很慢!!我的语句里有并行和append提示。请大家帮帮忙 想写办法调整一下 让插入的速度快些,谢谢!

解决方案 »

  1.   


    查询V$SESSION_WAIT,得到最多的等待事件及其次数:
    PX Deq Credit: send blkd        60
    db file parallel read        54
    PX Deq: Execution Msg        31
    db file parallel write        15
    rdbms ipc message        12好像并行的有问题?
      

  2.   

    在IO能力受限的情况下,只有尽量做到批量写入:
    1)插入时批量提交数据,合理控制事务单位,减轻磁盘压力,同时指定nologging
    2)alter session force parrel DML,同时,排除锁存在的可能
    3)bulk insert or Pro*c
    4)有索引的话,alter index nologging
    5)更多的database buffer cache,将表的cache设为keep,减少checkpoint时间间隔(比如增大日志组等)
      

  3.   

    可以提高cache buffer
    oracle安装的cache buffer默认为8kb,提高到16kb试试
      

  4.   

    buffer cache 是自动分配的,需要指定吗?如果指定的话最大能到多少呢?
      

  5.   

    9i后是通过db_cache_size来控制buffer_cache大小
    全表扫描,oralce根据buffer_cache的大小,决定是否绕过buffer_cache执行物理读
    觉得不够可以另行指定,Oracle有时候也不是很智能
    <=SGA吧