数据插入使用了以下几种方式

1. 逐条数据插入
2. 拼接sql语句批量插入
3. 拼接sql语句并使用Transaction
4. 拼接sql语句并使用SqlTransaction
5. 使用DataAdapter
6. 使用TransactionScope及SqlBulkCopy
7. 使用表值参数

数据库使用SQL Server,脚本如下

create table TestTable
(
Id int
,Name nvarchar(20)
)

程序中生成测试DataTable结构和测试数据的类如下

[c-sharp] view plaincopyprint?
1.public class Tools 
2.{ 
3.    public static DataTable MakeDataTable() 
4.    { 
5.        DataTable table = new DataTable(); 
6. 
7.        //生成DataTable的模式(schema)  
8.        table.Columns.Add("Id", Type.GetType("System.Int32")); 
9.        table.Columns.Add("Name", Type.GetType("System.String")); 
10. 
11.        //设置主键  
12.        table.PrimaryKey = new DataColumn[] { table.Columns["ID"] }; 
13.        table.Columns["Id"].AutoIncrement = true; 
14.        table.Columns["Id"].AutoIncrementSeed = 1; 
15.        table.Columns["Id"].ReadOnly = true; 
16.        return table; 
17.    } 
18. 
19.    public static void MakeData(DataTable table, int count) 
20.    { 
21.        if (table == null) 
22.            return; 
23. 
24.        if (count <= 0) 
25.            return; 
26. 
27.        DataRow row = null; 
28. 
29.        for (int i = 1; i <= count; i++) 
30.        { 
31.            //创建一个新的DataRow对象(生成一个新行)  
32.            row = table.NewRow(); 
33.            row["Name"] = "Test" + i.ToString(); 
34.            //添加新的DataRow  
35.            table.Rows.Add(row); 
36.        } 
37.    } 
38.} 
    public class Tools
    {
        public static DataTable MakeDataTable()
        {
            DataTable table = new DataTable();

//生成DataTable的模式(schema)
            table.Columns.Add("Id", Type.GetType("System.Int32"));
            table.Columns.Add("Name", Type.GetType("System.String"));

//设置主键
            table.PrimaryKey = new DataColumn[] { table.Columns["ID"] };
            table.Columns["Id"].AutoIncrement = true;
            table.Columns["Id"].AutoIncrementSeed = 1;
            table.Columns["Id"].ReadOnly = true;
            return table;
        }

public static void MakeData(DataTable table, int count)
        {
            if (table == null)
                return;

if (count <= 0)
                return;

DataRow row = null;

for (int i = 1; i <= count; i++)
            {
                //创建一个新的DataRow对象(生成一个新行)
                row = table.NewRow();
                row["Name"] = "Test" + i.ToString();
                //添加新的DataRow
                table.Rows.Add(row);
            }
        }
    }

使用Log4net记录日志,默认插入记录数为40000条,每次插入1条,可在界面修改,使用System.Diagnostics.StopWatch记录插入时间,每次测试后删除原表重建

窗体代码如下:

  1. public delegate bool InsertHandler(DataTable table, int batchSize);
  2. public partial class FrmBatch : Form
  3. {
  4. private Stopwatch _watch = new Stopwatch();
  5. public FrmBatch()
  6. {
  7. InitializeComponent();
  8. }
  9. private void FrmBatch_Load(object sender, EventArgs e)
  10. {
  11. txtRecordCount.Text = "40000";
  12. txtBatchSize.Text = "1";
  13. }
  14. //逐条数据插入
  15. private void btnInsert_Click(object sender, EventArgs e)
  16. {
  17. Insert(DbOperation.ExecuteInsert, "Use SqlServer Insert");
  18. }
  19. //拼接sql语句插入
  20. private void btnBatchInsert_Click(object sender, EventArgs e)
  21. {
  22. Insert(DbOperation.ExecuteBatchInsert, "Use SqlServer Batch Insert");
  23. }
  24. //拼接sql语句并使用Transaction
  25. private void btnTransactionInsert_Click(object sender, EventArgs e)
  26. {
  27. Insert(DbOperation.ExecuteTransactionInsert, "Use SqlServer Batch Transaction Insert");
  28. }
  29. //拼接sql语句并使用SqlTransaction
  30. private void btnSqlTransactionInsert_Click(object sender, EventArgs e)
  31. {
  32. Insert(DbOperation.ExecuteSqlTransactionInsert, "Use SqlServer Batch SqlTransaction Insert");
  33. }
  34. //使用DataAdapter
  35. private void btnDataAdapterInsert_Click(object sender, EventArgs e)
  36. {
  37. Insert(DbOperation.ExecuteDataAdapterInsert, "Use SqlServer DataAdapter Insert");
  38. }
  39. //使用TransactionScope
  40. private void btnTransactionScopeInsert_Click(object sender, EventArgs e)
  41. {
  42. Insert(DbOperation.ExecuteTransactionScopeInsert, "Use SqlServer TransactionScope Insert");
  43. }
  44. //使用表值参数
  45. private void btnTableTypeInsert_Click(object sender, EventArgs e)
  46. {
  47. Insert(DbOperation.ExecuteTableTypeInsert, "Use SqlServer TableType Insert");
  48. }
  49. private DataTable InitDataTable()
  50. {
  51. DataTable table = Tools.MakeDataTable();
  52. int count = 0;
  53. if (int.TryParse(txtRecordCount.Text.Trim(), out count))
  54. {
  55. Tools.MakeData(table, count);
  56. //MessageBox.Show("Data Init OK");
  57. }
  58. return table;
  59. }
  60. public void Insert(InsertHandler handler, string msg)
  61. {
  62. DataTable table = InitDataTable();
  63. if (table == null)
  64. {
  65. MessageBox.Show("DataTable is null");
  66. return;
  67. }
  68. int recordCount = table.Rows.Count;
  69. if (recordCount <= 0)
  70. {
  71. MessageBox.Show("No Data");
  72. return;
  73. }
  74. int batchSize = 0;
  75. int.TryParse(txtBatchSize.Text.Trim(), out batchSize);
  76. if (batchSize <= 0)
  77. {
  78. MessageBox.Show("batchSize <= 0");
  79. return;
  80. }
  81. bool result = false;
  82. _watch.Reset(); _watch.Start();
  83. result = handler(table, batchSize);
  84. _watch.Stop(www.nuoya66.com);
  85. string log = string.Format("{0};RecordCount:{1};BatchSize:{2};Time:{3};", msg, recordCount, batchSize, _watch.ElapsedMilliseconds);
  86. LogHelper.Info(log);
  87. MessageBox.Show(result.ToString());
  88. }
  89. }

.NET批量大数据插入性能分析及比较的更多相关文章

  1. 大数据应用之HBase数据插入性能优化实测教程

    引言: 大家在使用HBase的过程中,总是面临性能优化的问题,本文从HBase客户端参数设置的角度,研究HBase客户端数据批量插入性能优化的问题.事实胜于雄辩,数据比理论更有说服力,基于此,作者设计 ...

  2. Impala简介PB级大数据实时查询分析引擎

    1.Impala简介 • Cloudera公司推出,提供对HDFS.Hbase数据的高性能.低延迟的交互式SQL查询功能. • 基于Hive使用内存计算,兼顾数据仓库.具有实时.批处理.多并发等优点 ...

  3. .NET 百万级 大数据插入、更新 ,支持多种数据库

    功能介绍  (需要版本5.0.44) 大数据操作ORM性能瓶颈在实体转换上面,并且不能使用常规的Sql去实现 当列越多转换越慢,SqlSugar将转换性能做到极致,并且采用数据库最佳API 操作数据库 ...

  4. sql 根据指定条件获取一个字段批量获取数据插入另外一张表字段中+MD5加密

    /****** Object: StoredProcedure [dbo].[getSplitValue] Script Date: 03/13/2014 13:58:12 ******/ SET A ...

  5. 学习Hadoop+Spark大数据巨量分析与机器学习整合开发-windows利用虚拟机实现模拟多节点集群构建

    记录学习<Hadoop+Spark大数据巨量分析与机器学习整合开发>这本书. 第五章 Hadoop Multi Node Cluster windows利用虚拟机实现模拟多节点集群构建 5 ...

  6. "Entity Framework数据插入性能追踪"读后总结

    园友莱布尼茨写了一篇<Entity Framework数据插入性能追踪>的文章,我感觉不错,至少他提出了问题,写了出来,引起了大家的讨论,这就是一个氛围.读完文章+评论,于是我自己也写了个 ...

  7. 向mysql中批量插入数据的性能分析

    MYSQL批量插入数据库实现语句性能分析 假定我们的表结构如下 代码如下   CREATE TABLE example (example_id INT NOT NULL,name VARCHAR( 5 ...

  8. 大数据应用之HBase数据插入性能优化之多线程并行插入测试案例

    一.引言: 上篇文章提起关于HBase插入性能优化设计到的五个参数,从参数配置的角度给大家提供了一个性能测试环境的实验代码.根据网友的反馈,基于单线程的模式实现的数据插入毕竟有限.通过个人实测,在我的 ...

  9. 使用Oracle Stream Analytics 21步搭建大数据实时流分析平台

    概要: Oracle Stream Analytics(OSA)是企业级大数据流实时分析计算平台.它可以通过使用复杂的关联模式,扩充和机器学习算法来自动处理和分析大规模实时信息.流式传输的大数据可以源 ...

随机推荐

  1. 阿里云主机SSD实例磁盘测试及IO调度算法调整

    测试背景及环境说明 阿里云ECS 主机配置: 4C8G root@zabbix-master:~# grep -i "model name" /proc/cpuinfo model ...

  2. 解决Android AVD启动报错问题

    好不容易从ADT Bundle转为Android Studio的开发环境,一路荆棘,现在又遇到了模拟器的问题,本来直接用真机调试程序会更快些,但是为了模拟多种系统不得不开启AVD. 废话不说,问题和解 ...

  3. oracle包详解(二)【weber出品】

    一.重载子程序 PL/SQL中的重载功能: 1. 能够使用户创建两个或多个同名的子程序 2. 要求子程序的形式参数的数量,顺序或者数据类型不一样 3. 能够使用户使用不同的数据灵活的调用子程序 4. ...

  4. 图文混排——用表情代替"[文字]"

    1.简单设置带属性的字符串 定义一个NSMutableAttributedString带属性的字符串 NSMutableAttributedString *str = [[NSMutableAttri ...

  5. Private Members in JavaScript

    Private Members in JavaScript Douglas Crockford www.crockford.com JavaScript is the world's most mis ...

  6. CSS: Table-Layout & Word-Break 设置表和列的宽度固定不变

    1. 设置Table的列宽由表格宽度和列宽度设定(指定表格宽度,各个列宽度): table#tbl_id{table-layout:fixed;} 2. 设置TD内容根据宽度进行换行,即使字符串之间无 ...

  7. 设置ubuntu Android sdk环境变量

    cd /etc/ sudo gedit profile 在后面把tools和platform-tools的路径追加进去即可 PATH=$PATH:/home/android_sdk/tools 然后再 ...

  8. python Tips(不定期更新)

    dictionary sort 1.根据key排序,正向排序 sorted(dic.items(), key=lambda d: d[0]) 2.根据value排序,反向排序 sorted(dic.i ...

  9. 每次从vss获取文件都是只读

    在 Visual Studio 2008 中,使用 VSS 作为源码管理器,把文件签入后,文件会自动变为只读状态.在公司习惯是在某个开发人员的机器上获取最新的代码后编译,编译完之后服务器上再从 VSS ...

  10. linux源码安装nodejs

    如何在linux上安装nodejs环境 到网下载安装文件node-v5.10.1-linux-x64.tar.gz.   将源码包上传到linux的/usr/local/node/目录下,在该目录下解 ...