原insert语句如下:
insert into qa_data_tmp1(zzbm_bm,ypbm_bm,fxxmbm_bm,fxsj_rq,fxsj_cysj,fxsj_sj,fxsj_bz,fxsj_hgbz,fxsj_ids,fxsj_hgz,searchid,tmp_yph,tmp_date,ZZBM_MC,YPBM_MC,FXXMBM_MC,YPBM_LB,YPBM_BY2,YPBM_XSXH,FXXMBM_DW,FXXMBM_FL,FXXMBM_XSXH,FXXMBM_BY2,ZZBM_XSXH,ZZDYYP_IDS) 
select zzbm_bm,ypbm_bm,fxxmbm_bm,fxsj_rq,fxsj_cysj,fxsj_sj,fxsj_bz,fxsj_hgbz,fxsj_ids,fxsj_hgz,3,fxsj_by1,sysdate ,ZZBM_MC,YPBM_MC,FXXMBM_MC,YPBM_LB,YPBM_BY2,YPBM_XSXH,FXXMBM_DW,FXXMBM_FL,FXXMBM_XSXH,FXXMBM_BY2,ZZBM_XSXH,ZZDYYP_IDS  
from view_fxsjcx where length(fxsj_sj)>0  and  fxsj_rq between'2006-03-14'  and '2006-03-14'  and zzbm_mc in ('常压','催化','电精制','气分','加氢精制','重整','聚合','制硫','酸性水','油品气柜','小气分','产品质量数据','原材料质量数据')  and fxsj_by1  in( select fxsj_by1 from view_fxsj where  length(fxsj_sj)>0 and fxsj_rq>='2006-03-14' and fxsj_rq<='2006-03-14' and fxsj_hgbz='0') order by  ZZDYYP_IDS
刚开始的时候速度是很快的,但是过了几个月以后,发现插入一次竟然要30秒以上,就算只有40几条记录也要这么久,开始以为是索引的问题,结果把索引全部去掉,再用脚本重新生成,还是一样,请问各位大虾,是不是插入时要写入日志的问题??那么这个问题该怎么解决呢???

解决方案 »

  1.   

    索引是不能去的,应该优化你这里还有查询,
    建议先看看查询
    select zzbm_bm,ypbm_bm,fxxmbm_bm,fxsj_rq,fxsj_cysj,fxsj_sj,fxsj_bz,fxsj_hgbz,fxsj_ids,fxsj_hgz,3,fxsj_by1,sysdate ,ZZBM_MC,YPBM_MC,FXXMBM_MC,YPBM_LB,YPBM_BY2,YPBM_XSXH,FXXMBM_DW,FXXMBM_FL,FXXMBM_XSXH,FXXMBM_BY2,ZZBM_XSXH,ZZDYYP_IDS  
    from view_fxsjcx where length(fxsj_sj)>0  and  fxsj_rq between'2006-03-14'  and '2006-03-14'  and zzbm_mc in ('常压','催化','电精制','气分','加氢精制','重整','聚合','制硫','酸性水','油品气柜','小气分','产品质量数据','原材料质量数据')  and fxsj_by1  in( select fxsj_by1 from view_fxsj where  length(fxsj_sj)>0 and fxsj_rq>='2006-03-14' and fxsj_rq<='2006-03-14' and fxsj_hgbz='0') order by  ZZDYYP_IDS的性能
      

  2.   

    查询速度大概是2秒,就是前面加了insert以后变慢
      

  3.   

    需要看看insert和单独执行select的执行计划。
      

  4.   

    insert /*+ APPEND */into ..试试,这个表可能经过大量的DML碎片很多,建议先整理
      

  5.   

    回 cenlmmx(学海无涯苦作舟):
    执行完成,28.812秒回bobfang(匆匆过客) :
      具体怎么操作阿??
      

  6.   

    大批量插入最好关闭索引,要不会很慢的,还有约束也是一样.
    这样create table newtable as select * from qa_data_tmp1,
    再插入newtable看要多少时间?
      

  7.   

    回 cenlmmx(学海无涯苦作舟):
      照你的方法做了,再插入时间是25.629 ,22条记录
      

  8.   

    sorry没看到,你表里现在多少数据?
      

  9.   

    我是from的一个视图,视图里有46万条记录
      

  10.   

    现在问题是我在数据量20万条左右的时候,是很快的,那时新建了索引,补充了很多数据。到现在4个多月了,速度开始下来了,我的那个tmp1是做临时表用的,没有每次都在临时表空间里创建删除,但是现在速度很慢,不知道是什么原因,所以想请教高手,看看问题所在
      

  11.   

    现在我把视图改成from a,b,c where a.z1=b.z1 and .....代码放在后面,但是插入还是要16秒以上,怎么回事呢?
      

  12.   

    建议在qa_data_tmp1新增一列guid做主键。有可能是主键的原因。
    insert into qa_data_tmp1(id,zzbm_bm,ypbm_bm,fxxmbm_bm,fxsj_rq,fxsj_cysj,fxsj_sj,fxsj_bz,fxsj_hgbz,fxsj_ids,fxsj_hgz,searchid,tmp_yph,tmp_date,ZZBM_MC,YPBM_MC,FXXMBM_MC,YPBM_LB,YPBM_BY2,YPBM_XSXH,FXXMBM_DW,FXXMBM_FL,FXXMBM_XSXH,FXXMBM_BY2,ZZBM_XSXH,ZZDYYP_IDS)
    select newid(),zzbm_bm,ypbm_bm,fxxmbm_bm,fxsj_rq,fxsj_cysj,fxsj_sj,fxsj_bz,fxsj_hgbz,fxsj_ids,fxsj_hgz,3,fxsj_by1,sysdate ,ZZBM_MC,YPBM_MC,FXXMBM_MC,YPBM_LB,YPBM_BY2,YPBM_XSXH,FXXMBM_DW,FXXMBM_FL,FXXMBM_XSXH,FXXMBM_BY2,ZZBM_XSXH,ZZDYYP_IDS
    from view_fxsjc
      

  13.   

    你的视图还有join,那会更慢,想不出来什么好办法还是建议直接插表.
      

  14.   

    DECLARE
    CNT NUMBER(10):=0;
    I NUMBER(10);
    BEGINSELECT COUNT(*) INTO CNT FROM (select zzbm_bm,ypbm_bm,fxxmbm_bm,fxsj_rq,fxsj_cysj,fxsj_sj,fxsj_bz,fxsj_hgbz,fxsj_ids,fxsj_hgz,3,fxsj_by1,sysdate ,ZZBM_MC,YPBM_MC,FXXMBM_MC,YPBM_LB,YPBM_BY2,YPBM_XSXH,FXXMBM_DW,FXXMBM_FL,FXXMBM_XSXH,FXXMBM_BY2,ZZBM_XSXH,ZZDYYP_IDS  
    from view_fxsjcx where length(fxsj_sj)>0  and  fxsj_rq between'2006-03-14'  and '2006-03-14'  and zzbm_mc in ('常压','催化','电精制','气分','加氢精制','重整','聚合','制硫','酸性水','油品气柜','小气分','产品质量数据','原材料质量数据')  and fxsj_by1  in( select fxsj_by1 from view_fxsj where  length(fxsj_sj)>0 and fxsj_rq>='2006-03-14' and fxsj_rq<='2006-03-14' and fxsj_hgbz='0') order by  ZZDYYP_IDS
    )FOR I IN 1..TRUNC(CNT/500)+1 LOOPinsert into qa_data_tmp1(zzbm_bm,ypbm_bm,fxxmbm_bm,fxsj_rq,fxsj_cysj,fxsj_sj,fxsj_bz,fxsj_hgbz,fxsj_ids,fxsj_hgz,searchid,tmp_yph,tmp_date,ZZBM_MC,YPBM_MC,FXXMBM_MC,YPBM_LB,YPBM_BY2,YPBM_XSXH,FXXMBM_DW,FXXMBM_FL,FXXMBM_XSXH,FXXMBM_BY2,ZZBM_XSXH,ZZDYYP_IDS) 
    select zzbm_bm,ypbm_bm,fxxmbm_bm,fxsj_rq,fxsj_cysj,fxsj_sj,fxsj_bz,fxsj_hgbz,fxsj_ids,fxsj_hgz,3,fxsj_by1,sysdate ,ZZBM_MC,YPBM_MC,FXXMBM_MC,YPBM_LB,YPBM_BY2,YPBM_XSXH,FXXMBM_DW,FXXMBM_FL,FXXMBM_XSXH,FXXMBM_BY2,ZZBM_XSXH,ZZDYYP_IDS  
    from view_fxsjcx where length(fxsj_sj)>0  and  fxsj_rq between'2006-03-14'  and '2006-03-14'  and zzbm_mc in ('常压','催化','电精制','气分','加氢精制','重整','聚合','制硫','酸性水','油品气柜','小气分','产品质量数据','原材料质量数据')  and fxsj_by1  in( select fxsj_by1 from view_fxsj where  length(fxsj_sj)>0 and fxsj_rq>='2006-03-14' and fxsj_rq<='2006-03-14' and fxsj_hgbz='0') order by  ZZDYYP_IDS;COMMIT;
    END LOOP;
    END;
      

  15.   

    把 where 条件中的 in () 放到 where的后面,别放到整个sql语句的后面。试试。