一个关于INSERT插入特别慢的问题

ythszlm 2006-09-20 11:06:50
两个库a,b 建立了DBLINK用来连接
从B库的4个表取一些数据向A库的一个表中插入,SELECT B库的时候只用10秒中就检索出了我需要的数据。但是向A库中的表插入的时候却需要差不多20分钟。也没有主键冲突。请问我应该怎样做能插入的快一些。
insert into dssf_ab
select 20060801,d.dept_code,d.dept_name,c.ELEC_TYPE_CODE,sum(c.P_POWER),
sum(c.V_POWER),sum(c.N_POWER),sum(c.P_NUM_MONEY+c.P_PLUS_TOTAL),
sum(c.v_NUM_MONEY+c.v_PLUS_TOTAL),sum(c.n_NUM_MONEY+c.n_PLUS_TOTAL)
from df_money_files@tjnd c,df_write_sect@tjnd b,price_type@tjnd e,rs_dept@tjnd d
where b.WRITE_SECT_NO=c.WRITE_SECT_NO and b.business_place_code=d.dept_code and d.dept_level_flag='3' and c.price_code=e.price_code
and c.ELEC_TYPE_CODE not in('0','4') and b.mon=c.mon and c.mon_sn='1'
and to_number(to_char(b.mon,'yyyymm'))=200608
检索出来的语句与dssf_ab里的字段是一一对应的
...全文
431 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2007-04-25
  • 打赏
  • 举报
回复
关注
wwwcsdnet 2007-04-25
  • 打赏
  • 举报
回复
两个库a,b 建立了DBLINK用来连接
从B库的4个表取一些数据向A库的一个表中插入,SELECT B库的时候只用10秒中就检索出了我需要的数据。但是向A库中的表插入的时候却需要差不多20分钟。也没有主键冲突。请问我应该怎样做能插入的快一些。
insert into dssf_ab
select 20060801,d.dept_code,d.dept_name,c.ELEC_TYPE_CODE,sum(c.P_POWER),
sum(c.V_POWER),sum(c.N_POWER),sum(c.P_NUM_MONEY+c.P_PLUS_TOTAL),
sum(c.v_NUM_MONEY+c.v_PLUS_TOTAL),sum(c.n_NUM_MONEY+c.n_PLUS_TOTAL)
from df_money_files@tjnd c,df_write_sect@tjnd b,price_type@tjnd e,rs_dept@tjnd d
where b.WRITE_SECT_NO=c.WRITE_SECT_NO and b.business_place_code=d.dept_code and d.dept_level_flag='3' and c.price_code=e.price_code
and c.ELEC_TYPE_CODE not in('0','4') and b.mon=c.mon and c.mon_sn='1'
and to_number(to_char(b.mon,'yyyymm'))=200608
检索出来的语句与dssf_ab里的字段是一一对应的
-----------------------------------------------------------------------------

这个问题如果是我来处理的话,最最简洁的方法如下:
首先,在B库建这个临时表
CREATE TABLE tempA AS
select 20060801,d.dept_code,d.dept_name,c.ELEC_TYPE_CODE,sum(c.P_POWER),
sum(c.V_POWER),sum(c.N_POWER),sum(c.P_NUM_MONEY+c.P_PLUS_TOTAL),
sum(c.v_NUM_MONEY+c.v_PLUS_TOTAL),sum(c.n_NUM_MONEY+c.n_PLUS_TOTAL)
from df_money_files c,df_write_sect b,price_type e,rs_dept d
where b.WRITE_SECT_NO=c.WRITE_SECT_NO and b.business_place_code=d.dept_code and d.dept_level_flag='3' and c.price_code=e.price_code
and c.ELEC_TYPE_CODE not in('0','4') and b.mon=c.mon and c.mon_sn='1'
and to_number(to_char(b.mon,'yyyymm'))=200608
其次,将B库的临时表同步到A库
CREATE TABLE tempB AS SELECT * FROM tempA@B,
最后,按需要的取值,

扰共分三步。按这个操作步骤来操作速度应该说不是问题。
HelloWorld_001 2007-04-25
  • 打赏
  • 举报
回复
嫌慢的话,如果不是经常这样的话
先select出来,然后导出来成文本,再导进去
ythszlm 2006-09-20
  • 打赏
  • 举报
回复
那我改怎么办呀,能不能请各位大侠给出详细的指示
fuxia 2006-09-20
  • 打赏
  • 举报
回复
这只是执行计划的一个hint
ythszlm 2006-09-20
  • 打赏
  • 举报
回复
老大 这个insert into /*+ append */dssf_ab中的 /*+ append */是什么意思呀,小弟接触ORACLE时间不长,望指点一二呀
wiler 2006-09-20
  • 打赏
  • 举报
回复
insert into dssf_ab
改为
insert into /*+ append */dssf_ab
gechangwei 2006-09-20
  • 打赏
  • 举报
回复
10秒中估计只是看到前面几条记录,有没有append提示速度相差不会这么大。
ythszlm 2006-09-20
  • 打赏
  • 举报
回复
怎么改?
wiler 2006-09-20
  • 打赏
  • 举报
回复
SELECT B库的时候只用10秒中就检索出了我需要的数据
估计是前多少行吧?

改为优化提示的话,速度会有提高的

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧