通过查询得到需要插入的数据,可能有20w条左右的数据,现在做 insert 到另一个表要几十分钟,请教应该如何优化。如果有事务的需求的话应该怎么做?

解决方案 »

  1.   

    程序insert?还是存储过程?
    按理单纯的insert操作会很快的
      

  2.   

    有个类是专门做批量插入操作的,好像叫
    blukcopy,插入1w条数据1秒钟都不要
      

  3.   

                    using (SqlBulkCopy insertSqlBulk = new SqlBulkCopy(_conn))
                    {
                        foreach (DataTable dt in ds.Tables)
                        {
                            insertSqlBulk.DestinationTableName = dt.TableName;
                            insertSqlBulk.WriteToServer(dt);
                        }
                    }
                }
      

  4.   

    可能直接用sql语句比较好http://dianziermu.javaeye.com/blog/405315
    select into 和 insert into select 两种表复制语句
     
    select * into destTbl from srcTblinsert into destTbl(fld1, fld2) selec t fld1, 5 from srcTbl以上两句都是将 srcTbl 的数据插入到 destTbl,但两句又有区别的。第一句(select into from)要求目标表(destTbl)不存在 ,因为在插入时会自动创建。第二句(insert into select from)要求目标表(destTbl)存在 ,由于目标表已经存在,所以我们除了插入源表(srcTbl)的字段外,还可以插入常量 ,如例中的:5。
      

  5.   

    使用存储过程
    存储过程是已经在数据库中编译好了的,比程序中的代码快
    Access中没有存储过程
      

  6.   


    批量插入是要有datatable的,你要产生新字段,不就是对一个datatalbe操作吗?加上新的column,产生后直接赋值给它,然后把整个datatable一把批量插入到数据库不就行了??sqlbulkcopy做批量插入时相当快的
      

  7.   

    参考一下,偶的这个代码,呵呵,http://blog.csdn.net/Linux7985/archive/2009/03/05/3959716.aspx
      

  8.   

    使用DbTransaction (包括SqlTransaction,OracleTransaction 等 ),然后批量Commit 可以很大提高数据插入效率~~~~
      

  9.   

    多谢楼上几位,顺便再问下,用 bulkcopy的时候,目标表里有一列是 identity primary key ,我的源表里可以不创建这列吗?
      

  10.   

    bulk~
    插零时表,再批量写入正式表
      

  11.   

    楼上能具体说说吗?linq 比 bulkcopy 快?
      

  12.   


    bulkcopy是纯粹位了调高速度而设计的,也是基于数据操作的,linq是在数据库操作上进行的封装,怎么可能会快呢?linq2sql只是方便用c#编程操作数据库而已,既然有封装那么必然有性能损耗,sqlbulkcopy只能做insert操作,其他操作室不允许的,要追求速度就得足够简单,这是真理。
      

  13.   

    SQL Server可以试试SqlBulkCopy类,或换存储过程试试,添加事务没有,一次性提交
      

  14.   

    20w条数据并不算多,插入不需要几十分钟的,一般的插入,1w条只须1秒钟。所以,你需要检查一下你的sql语句,以及实现思路。
    如果你有事务需求的话,我建议你把这些数据放到另外一个表中,在该表维护一个字段:flag(bit),然后你可以多次小批量处理,比如一次处理100条,方式数据处理成功了,再将flag字段置为1.那么这会避免大的事务,也会提高对大数据量处理的可控性。
    不过用这样的方法来对付20w条数据,似乎有点杀鸡用牛刀了,我上天处理1300w条数据,就是这么干的。
      

  15.   

    长见识了...还没有用过SqlBulkCopy 
      

  16.   

    SqlBulkCopy 是个类似BCP功能的类,我居然一直没发现它,虽然只能导入到SQLSERVER,不过免去了外部调用BCP的麻烦,也是不错的。