数据库db2中有一万条记录,使用 insert into table(column1,column2,...)select …… 语句在数据库的命令窗口执行只需3秒钟,在继承自jdbcDaoSupport的java程序中,通过getJdbcTemplate().update(policyInsertSql);同样的SQL却执行了9分钟,请问有什么方式可以提高在java中执行的效率,我用的spirng版本为1.2.7,spring jdbc 的哪个api执行效率高啊,急啊,高分求回复

解决方案 »

  1.   

    1# 升级spring到3.0
    2# 减少有关sql的日志,或者干脆不要3秒钟和9分钟差得太远了,不知道楼主有没有打错字?
      

  2.   

    现在生产已经在用了,spring 不太好升级,没有打错字,确实差的太远,所以才担心性能问题如果用jdbcDaoSupport,sql日志不是很多。
      

  3.   

    通过程序插入是很慢的。上次插入 300 多万的数据花了一个半小时,而且还是利用原始的 JDBC 使用 executeBatch 进行操作的。
      

  4.   

    对于大量数据的插入,不能一次性提交事务,可以 5000 条提交一次事务,否则的话数据库会吃不消的。采用 INSERT INTO ... SELECT 这种方式不是很好,整个语句作为一个长事务。如果只是一次性操作的话,
    建议直接在数据库系统客户端直接执行。再有可能慢的原因是这个表建有索引,在每插入一条数据时会重建索引,导致 INSERT 语句缓慢。
      

  5.   

    你都会写sql语句
    为什么就不会用这个呢
      

  6.   

    我的 sql 语句为
    insert into db2inst1.YBTPOL (UPDATEED,POLFLAG,HEBAOFLAG,BANKCDE,SIGNEDDATE,APPSERNUM,POLICYNO,APPNAME,APPIDTYPE,APPIDNUM,INSNAME,INSIDTYPE,INSIDNUM,APPLNUM,ADMISSTATU,POLRESULT,GROSSPREM,RMARK) select 20090714, '1', yb.HEBAOFLAG, yb.BANKCDE, yb.SIGNEDDATE,  yb.APPSERNUM, ab.CHDRNUM ,ap.name, ap.type, ap.no,  ins.name ,ins.type, ins.no,  aa.APPLNUM  , aa.PROCFLG ,  ab.APPROVAL , ab.FIRSTPREM, ''  from  db2inst1.YBTINP yb   , db2inst1.AFIAPF af   , db2inst1.CANOPF ca  , db2inst1.EUAAPF aa  , db2inst1.EUABPF ab  , (select cl.CLNTNUM as num , cl.SURNAME as name , cl.ROLEFLAG35 as type, cl.SECUITYNO as no ,ad1.APPLNUM as app1  from db2inst1.CLNTPF cl ,db2inst1.EUADPF ad1 where ad1.CLNTNUM = cl.CLNTNUM  and ad1.ROLEFLAG= '1'  ) ap   , (select cl.CLNTNUM as num , cl.SURNAME as name , cl.ROLEFLAG35 as type, cl.SECUITYNO as no,ad2.APPLNUM as app2  from db2inst1.CLNTPF cl ,db2inst1.EUADPF ad2 where ad2.CLNTNUM = cl.CLNTNUM  and AD2.ROLEFLAG= '2'  ) ins   where af.CHDRNUM = yb.APPSERNUM   and ca.BATNUM = af.INVOICENO   and aa.APPLNUM = ca.CASENUM    and ab.APPLNUM = ca.CASENUM  and ap.app1=ca.CASENUM  and ca.CASENUM=ins.app2  and yb.HEBAOFLAG  = '0'  and ab.STAT_FUND = 'M' ; 
      

  7.   

    直接执行SQL那可工作在OSI会话层的。程序执行SQL--要在应用层和会话层反复交互。当然慢了。---------------------------------------
    我以前提升的方法:INSERT INTO T_INPUT_TEMPLATE
    SELECT 1,'文本输入框',NOW(),'text.ftl' UNION ALL
    SELECT 2,'复选框',NOW(),'checkbox.ftl'UNION ALL
    SELECT 3,'单选框',NOW(),'radio.ftl'UNION ALL
    SELECT 4,'下拉列表框',NOW(),'select.ftl'UNION ALL
    SELECT 5,'文件输入框',NOW(),'file.ftl';

    100条一次事务提交,---------------------------------------------------------------
    还有文件装载方略:数据库都有一些方式 从文件保存数据,自然有恢复数据的:
    load xxx.csv into table xxx
    10000 items正好在excel 65000范围内。
    -----------------------------------------------------------------
    还有一些方略我要留着自己用。
      

  8.   


    你的 SQL 语句写得太强大了!