.NET批量大数据插入性能分析及比较

原文:.NET批量大数据插入性能分析及比较

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

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记录插入时间,每次测试后删除原表重建

窗体代码如下:

[c-sharp] www.nuoya118.com

  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. }
时间: 2024-10-26 01:27:39

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

&quot;Entity Framework数据插入性能追踪&quot;读后总结

园友莱布尼茨写了一篇<Entity Framework数据插入性能追踪>的文章,我感觉不错,至少他提出了问题,写了出来,引起了大家的讨论,这就是一个氛围.读完文章+评论,于是我自己也写了个简单的程序试了试. 先晒一下代码: 两个简单的类: 1: /// <summary> 2: /// 消费者 3: /// </summary> 4: public class Consumer 5: { 6: public int CId { get; set; } 7: public

大数据和预测分析:数据是否越多越好?

Michael Berry对大数据的浮夸之词颇不以为然.身为旅游网站TripAdvisor的分析总监,他认为更多的数据未必带来正面的业务影响,比如大数据和预测分析的例子. “很多预测分析的应用其实并不需要所有的数据.”Berry在Predictive Analytics World做主题演讲时说到.因此,对于数据科学家来说,重要的不是想着怎样分析所有的数据,而是看通过哪些数据可以得出真正有价值的结果.那么到底该怎么办呢?“对于这个问题,没有直截了当的答案.”Berry说. 但是,通过每次增加一些

能源管控系统开发,BI大数据可视化管理分析平台开发

能源管理系统是以帮助工业生产企业在扩大生产的同时,合理计划和利用能源,降低单位产品能源消耗,提高经济效益为目的信息化管理系统.通过能源计划,能源监控,能源统计,能源消费分析,重点能耗设备管理,能源计量设备管理等多种手段,是企业管理者对企业的能源成本比重发展趋势有准确的掌握,并将企业的能源消费计划任务分解到各个单位,是节能工作责任明确,促进企业健康稳定发展.针对我国工业生产线中的在线计量.功效检测技术和节能控制技术严重缺乏等问题.研究开发工业生产线关键点在线电能计量.加工功效有效性分析技术,工业生

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

MYSQL批量插入数据库实现语句性能分析 假定我们的表结构如下 代码如下   CREATE TABLE example (example_id INT NOT NULL,name VARCHAR( 50 ) NOT NULL,value VARCHAR( 50 ) NOT NULL,other_value VARCHAR( 50 ) NOT NULL) 通常情况下单条插入的sql语句我们会这么写: 代码如下   INSERT INTO example(example_id, name, valu

数据库批量数据插入问题分析

在数据库的相关开发中,经常会遇到数据的批量插入问题.本文主要是通过实验的方式探讨批量数据插入的瓶颈,以及优化建议. 以10w条记录的插入作为实验对象,采用下面的几种方法插入: 1.       普通插入:普通的一条条插入 2.       普通插入+手动提交:setAutoCommit(false).commit() 3.       普通插入+手动提交+ prepareStatement方式 4.       批量插入:addBatch.executeBatch 5.       批量插入:i

Sqlite大数据写入性能优化

众所周知,Sqlite是一个轻量级的数据库,仅仅需要一个exe文件就能运行起来.在处理本地数据上,我比较喜欢选择使用它,不仅是因为他与sql server有着比较相近的语法,还因为它不需要安装,仅需要通过命令行就能启动了,而且他在处理大数据时,性能比sql server好很多,好吧这里不继续争论性能优劣. 首先,这次的问题是在一次项目中遇到的,项目要求能大量导入数据,而且由于项目性质(轻便,本地化),所以我选择sqlite来存放数据. 第一版代码: 1 StringBuilder sql = n

提升大数据数据分析性能的方法及技术(二)

上部分链接 致谢:因为我的文章之前是在word中写的,贴过来很多用mathtype编辑的公式无法贴过来,之前也没有经验. 参考http://www.cnblogs.com/haore147/p/3629895.html,一文完成公式的迁移. 同时,说一句,word中用mathtype写的公式用ALT+\可以转换成对应的latex语法公式. 5 数据流过滤技术 信息大爆炸时代的到来使得针对数据进行深层次的挖掘成为数据处理的核心任务[21].但是在上面已经提到了,源数据的来源和数据的组成格式都是各种

提升大数据数据分析性能的方法及技术(一)

关于此文 最近在忙着准备校招的相关复习,所以也整理了一下上学期上课时候的学到的一些知识.刚好发现当时还写了一篇类似于文献综述性质的文章,就在这里贴出来.题材是关于大数据的,也是比较火热的一个话题,虽然现在接触的项目与大数据不太有关联,可能以后也不一定从事这方面的工作吧.就IT行业的研究成果来讲国外期刊无论是发表速度还是质量都是高于国内,所以参考的大部分都是当时最新在核心期刊上发表的论文,参考文献在最后一一列出.因为文章没有多少自己的创新点,仅仅是最新.最热技术或者分析的一个总结,所以放上来仅仅是

SqlServer数据插入性能小记

对于SQL性能,已经很久没关注了.由于近期项目既没有几千万的海量数据也没有过多的性能要求,所以在性能上也就没下太多功夫.然而,前不久和朋友闲谈间话题一转就说到程序上了,他说他用Delphi做了个数据导入的功能,插入数据的时候感觉很慢.以个人对SQL的了解,就建议他使用批量插入的方式,并很认真的告诉他这样应该会快很多.而在实际工作中,类似批量导入数据的功能是非常常见的,也许一个不小心我们就搞挂了服务器.那就究竟要怎么做才能给服务器留条活路,让用户不用点完上传看部电影再看上传结果呢?为此做了个小实验