insert插入速度很慢的问题(高手请进,解决马上结帖)
原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几条记录也要这么久,开始以为是索引的问题,结果把索引全部去掉,再用脚本重新生成,还是一样,请问各位大虾,是不是插入时要写入日志的问题??那么这个问题该怎么解决呢???
问题点数:80、回复次数:21Top
1 楼mosquitoxh((IT,中间件,架构)http://it.paiming.org/bbs)回复于 2006-03-15 12:28:07 得分 20
索引是不能去的,应该优化
你这里还有查询,
建议先看看查询
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
的性能
Top
2 楼hsgzs(雾尘心)回复于 2006-03-15 12:58:25 得分 0
查询速度大概是2秒,就是前面加了insert以后变慢Top
3 楼bobfang(匆匆过客)回复于 2006-03-15 13:49:03 得分 0
需要看看insert和单独执行select的执行计划。Top
4 楼cenlmmx(学海无涯苦作舟)回复于 2006-03-15 13:56:34 得分 60
insert /*+ APPEND */into ..试试,这个表可能经过大量的DML碎片很多,建议先整理Top
5 楼hsgzs(雾尘心)回复于 2006-03-15 14:00:50 得分 0
回 cenlmmx(学海无涯苦作舟):
执行完成,28.812秒
回bobfang(匆匆过客) :
具体怎么操作阿??Top
6 楼hsgzs(雾尘心)回复于 2006-03-15 14:03:40 得分 0
对于插入的表我做了很多的索引,每次插入的时候都要查一遍索引,看是否重复,但是我把索引删掉一次后,还是要这么多的时间,不知道什么原因??Top
7 楼cenlmmx(学海无涯苦作舟)回复于 2006-03-15 14:17:04 得分 0
大批量插入最好关闭索引,要不会很慢的,还有约束也是一样.
这样create table newtable as select * from qa_data_tmp1,
再插入newtable看要多少时间?Top
8 楼hsgzs(雾尘心)回复于 2006-03-15 14:23:30 得分 0
回 cenlmmx(学海无涯苦作舟):
照你的方法做了,再插入时间是25.629 ,22条记录
Top
9 楼cenlmmx(学海无涯苦作舟)回复于 2006-03-15 14:49:08 得分 0
怎么还这么大,插了多少数据?Top
10 楼cenlmmx(学海无涯苦作舟)回复于 2006-03-15 14:49:56 得分 0
sorry没看到,你表里现在多少数据?Top
11 楼hsgzs(雾尘心)回复于 2006-03-15 15:29:19 得分 0
我是from的一个视图,视图里有46万条记录Top
12 楼cenlmmx(学海无涯苦作舟)回复于 2006-03-15 15:45:10 得分 0
那直接插表不通过视图怎么样,时间多少?Top
13 楼hsgzs(雾尘心)回复于 2006-03-15 16:05:19 得分 0
直接插表的话,速度快一点,大概10秒,但是我的视图查询很快阿,两秒上下阿,有关系么??
Top
14 楼cenlmmx(学海无涯苦作舟)回复于 2006-03-15 16:12:26 得分 0
插视图会比直接插表慢些,但这个具体量化值没研究过.Top
15 楼hsgzs(雾尘心)回复于 2006-03-15 17:38:21 得分 0
现在问题是我在数据量20万条左右的时候,是很快的,那时新建了索引,补充了很多数据。到现在4个多月了,速度开始下来了,我的那个tmp1是做临时表用的,没有每次都在临时表空间里创建删除,但是现在速度很慢,不知道是什么原因,所以想请教高手,看看问题所在Top
16 楼hsgzs(雾尘心)回复于 2006-03-16 09:20:10 得分 0
现在我把视图改成from a,b,c where a.z1=b.z1 and .....代码放在后面,但是插入还是要16秒以上,怎么回事呢?Top
17 楼lishaowensdut(小李探花)回复于 2006-03-16 09:51:10 得分 0
建议在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_fxsjcTop
18 楼cenlmmx(学海无涯苦作舟)回复于 2006-03-16 09:59:44 得分 0
你的视图还有join,那会更慢,想不出来什么好办法还是建议直接插表.Top
19 楼mosquitoxh((IT,中间件,架构)http://it.paiming.org/bbs)回复于 2006-03-16 12:13:51 得分 0
DECLARE
CNT NUMBER(10):=0;
I NUMBER(10);
BEGIN
SELECT 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 LOOP
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;
COMMIT;
END LOOP;
END;
Top
20 楼hsgzs(雾尘心)回复于 2006-03-16 14:31:56 得分 0
决定不用视图了,直接插表,速度终于起来了,2秒左右,谢谢各位大大了,送分Top
21 楼ming500(ming500)回复于 2006-03-16 23:19:25 得分 0
把 where 条件中的 in () 放到 where的后面,别放到整个sql语句的后面。试试。Top




