本帖最后由 liulan616 于 2009-07-29 17:24:09 编辑

解决方案 »

  1.   

    1.写存储过程吧,每次提交insert数据库引擎都要解析,效率很低
    2.dw_scada_real是否有索引和约束,如果数据量很大,先删除这些,插入后再加上
    3.可以考虑把你1-3过程结果先放到临时表,包含table_name,column_name,scadaid
      

  2.   

    从第二步开始,把scadaid内容放进临时表中,
    后面的都是批量操作,而不是单个的。如select t.history_table_name,t.history_column_name 
      from v_ds_scada_ycdyb t,tmptable a  
    where t.yc_id = a.scadaid; insert 变成 insert into  select 的过程。
      

  3.   

    回复1楼的兄弟:
     1 dw_scada_real的插入数据是很频繁的,每15分钟需要执行一次增量操作,不能清空数据。 2 即使把1-3的结果存到一个临时表中,还是需要根据scadaid遍历所有的表名和字段名来拼每条不同的SQL,该问题效率低不在于拼接不同的SQL这一步,而在于执行每次insert操作,因为每一个表名所代表的表都属于历史数据表,数据量非常大,执行效率较低,再加上所有的scadaid代表的表名和字段名不同,似乎没有办法做成一次性的插入操作 3 2楼说的没有解决根本问题,即使把所有表名字段名用一个SQL能查出来,还是需要拼不同的表来得到scadaid说对应的数据,不可能做到所有不同的表名用一个SQL能访问出来吧(用PL/SQL或者JAVA来实现其实本质上没有区别,访问的内核都是数据库驱动,效率上应该没有什么分别) 4 问题的根本就是insert后面的select语句,每条from的表都不同,用程序或者函数来实现的话,只能一次执行一个表,有什么办法能一次查询出所有表的数据来呢
      

  4.   

    不是我不贴,是因为执行的关键操作部分(insert操作是用JAVA实现的),我不知道用JAVA怎么加载执行计划
      

  5.   

    5 insert into dw_scada_real(st_code,ptnum,cdate,ctime,val)
                select 'A','"+scadaid+"',to_char(occur_time,'yyyymmdd'),
                to_char(occur_time,'hh24miss'),"+colum
                from ems."+tabl+"@DBL_DS_SCADA.HZ
                where to_char(occur_time,'yyyymmddhh24miss')>'"+maxtime+"'";问题存在于不能进行一次性的批量操作,只能通过循环遍历出scadaid后,分别得到每次insert操作的表名和字段名,效率很低,希望有高手能指点一二,提高该问题的执行效率,谢谢!楼主,请问通过DBLINK查询的远端目标表tabl,数据量大吗?字段occur_time有索引吗?
    如果表很大,又没索引,insert慢是毫无疑问的。
      

  6.   

    变量tabl代表的这些表数据量都很大,几千万以上,我也想到过where条件中occur_time不加转换,但对方表中该字段没有加索引,所以效率改善不明显。