从第二步开始,把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 的过程。
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慢是毫无疑问的。
2.dw_scada_real是否有索引和约束,如果数据量很大,先删除这些,插入后再加上
3.可以考虑把你1-3过程结果先放到临时表,包含table_name,column_name,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 的过程。
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的表都不同,用程序或者函数来实现的话,只能一次执行一个表,有什么办法能一次查询出所有表的数据来呢
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慢是毫无疑问的。