如题

解决方案 »

  1.   

    数据库批量插入数据的几种方案
     技术方案一:
     实现方式是利用数据库访问类调用存储过程,利用循环逐条插入。很明显,这种方式效率并不高
      技术方案二:
      ADO.NET2.0的一个新的特性:SqlBulkCopy。有关这个的性能,很早之前我是亲自做过性能测试的,效率非常高。
      技术方案三:
      利用SQLServer2008的新特性--表值参数(Table-Valued Parameter)。表值参数是SQLServer2008才有的一个新特性,使用这个新特性,我们可以把一个表类型作为参数传递到函数或存储过程里。不过,它也有一个特点:表值参数在插入数目少于 1000 的行时具有很好的执行性能。
      技术方案四:
      对于单列字段,可以把要插入的数据进行字符串拼接,最后再在存储过程中拆分成数组,然后逐条插入。查了一下存储过程中参数的字符串的最大长度,然后除以字段的长度,算出一个值,很明显是可以满足要求的,只是这种方式跟第一种方式比起来,似乎没什么提高,因为原理都是一样的。
      技术方案五:
      考虑异步创建、消息队列等等。这种方案无论从设计上还是开发上,难度都是有的。
      

  2.   

    批导入数据使用SqlBulkCopy
    using (SqlBulkCopy bulkCopy = new SqlBulkCopy(
      connectionString, SqlBulkCopyOptions.KeepIdentity |
      SqlBulkCopyOptions.UseInternalTransaction))
      {
      bulkCopy.BatchSize = 10;
    }
    循环插入
    查询添加索引,分页查询
      

  3.   

    使用bulkCopy效率不错
    http://www.cnblogs.com/doll-net/archive/2007/07/22/827261.html
      

  4.   

      确定是经常添加修改就bulkCopy,不然循环就行了
      

  5.   

    --自然数表1-1M
    CREATE TABLE Nums(n int NOT NULL PRIMARY KEY CLUSTERED)
    --书上介绍了很多种填充方法,以下是最高效的一种,需要SS2005的ROW_NUMBER()函数。
    WITH B1 AS(SELECT n=1 UNION ALL SELECT n=1), --2
    B2 AS(SELECT n=1 FROM B1 a CROSS JOIN B1 b), --4
    B3 AS(SELECT n=1 FROM B2 a CROSS JOIN B2 b), --16
    B4 AS(SELECT n=1 FROM B3 a CROSS JOIN B3 b), --256
    B5 AS(SELECT n=1 FROM B4 a CROSS JOIN B4 b), --65536
    CTE AS(SELECT r=ROW_NUMBER() OVER(ORDER BY (SELECT 1)) FROM B5 a CROSS JOIN B3 b) --65536 * 16
    INSERT INTO Nums(n)
    SELECT TOP(1000000) r FROM CTE ORDER BY r
      

  6.   

    http://topic.csdn.net/u/20100528/16/F3C160A2-6D97-4E19-8F74-154D34A940D7.html