10w条数据,先插入A表,再取出,并插入到B表(A,B表结构相同)
Mysql, SQL Server
A(bigint, char, char, char)  其中bigint由随机数发生器生成我试过了AddBatch,和直接使用PreparedStatement,效果均不佳
而写存储过程中,发现不便将java中动态生成的bigint赋给存储过程
因此只能赋一次,调一次,效率很低不知高手有什么好的解决办法?在线等!

解决方案 »

  1.   

    几个关键点:
    1。从a表select的时候每次尽量多select几个纪录,其实只有10w条记录尽可以一次全select到CachedRowSet里
    2。不要一条一条的插,会很慢,对select处的结果处理生成一个sql文件,这个过程很快
    3。去掉b的索引
    4。命令行下一次执行这个sql文件
    5。重建b的索引
      

  2.   

    StringBuilder createProcedure = new StringBuilder();
    createProcedure.append("Create procedure insertData ()");
    createProcedure.append("BEGIN");
    for(int i=1; i<30000; i++)
    createProcedure.append(" Insert into A Values(" + String.valueOf(IDGen.genID()) + ", '2', '3', '4');");
    createProcedure.append("END");

    Statement stmt = conn.createStatement();
    stmt.executeUpdate(createProcedure.toString()); CallableStatement cstmt = conn.prepareCall("{call insertData()}");
    cstmt.executeUpdate();
    cstmt.close();
    我是生成一个sql StringBuilder,但是有3w条insert语句,这个String的构建就已经很慢了,大概10sec,然后preCall花了10secs,最后执行存储过程却只用了1sec
      

  3.   

    你用sqlserver的guid来随即生成,不要前台来做.不就是实现唯一的功能.
    CREATE TABLE A
       (UniqueColumn   UNIQUEIDENTIFIER      DEFAULT NEWID(),
       col_A      VARCHAR(10) 
       col_B      VARCHAR(10) 
       col_C      VARCHAR(10) )
    GO
    那你只需要 createProcedure.append(" Insert into A Values(" + " '2', '3', '4');");
    再用过while语句.
    Create procedure insertData ()
    as
    declare @iter int
    set @iter=0
    while @iter<20000
     Insert into A Values( '2', '3', '4')
    go
      

  4.   

    我用了NEWID(),但一次插入10w条时,速度很慢阿
    这个函数要去取网卡MAC地址,还要取计算机系统时间
    虽然能绝对保持唯一性,但如果大量重复运行,应该是不行吧
      

  5.   

    SQL Server:
       (1)先插入:
    Create procedure insertData as 
    BEGIN 
    Set nocount on;
    declare @iter int;
    set @iter=0;
    while @iter<10000
    Begin 
    Insert into A Values(NEWID(),'2','3','4');
    select @iter=@iter+1; 
    End
    create Unique index AID on A(id);
    END
       (2)再select出来插到b表里
                    String UpdSQL = "insert into b select * from a order by id asc";
    Statement stmt = conn.createStatement();
    stmt.execute(UpdSQL);
       (3)最后删除a表数据
                    String DelSQL = "Truncate table a";
    Statement stmt = conn.createStatement();
    stmt.execute(DelSQL);Mysql:
      (1)          String InsSQL = "Insert into A Values (?,?,?,?)";
    PreparedStatement pstmt = conn.prepareStatement(InsSQL);
    for (int i = 1; i <= 100000; i++) {
    pstmt.setLong(1, IDGen.genID());  //好象Mysql没有GUID
    pstmt.setString(2, "2");
    pstmt.setString(3, "3");
    pstmt.setString(4, "4");
    pstmt.addBatch();
    }
    pstmt.executeBatch();
    pstmt = conn.prepareStatement("create Unique index AID on A(id)");
    pstmt.executeUpdate();
      (2),(3)如SQL Server高手看看还有什么能优化的否?
      

  6.   

    10w 条记录
    SQL Server   37.937 secs
    Mysql          27.703 secs
      

  7.   

    另外,在oracle中的存储过程:
    create prco insertData
        count out number;
        Begin
            count := 0;
            while count<100000 loop
                insert into A Values(IDGen.genID(), '2','3','4');
                count := count + 1;
            End loop;
        End insertData;
    大家看看还有没更好的办法