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

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

物联网时代制造企业对大数据的运用分析

文章讲的是物联网时代制造企业对大数据的运用分析,每个人都是数据产生者.拥有者和消费者, 有人已经预言未来的时代是一个"大数据"的时代,关注大数据的人越来越多,同时 物联网的出现与发展推动了数据采集的能力,为数据库的建立提供了有力的支撑.数据的采集处理应用将成为时代的发展主题. 大数据对促进供应链中的生产环节产生了前所未有的巨大影响,每个企业都有自己的规划和自己企业在运营环节的管理最佳实践,在众多的运营决策改进里面,大数据的影响包括产品设计,质量控制,客户画像等等.下面从八个方面介绍大数

大数据与情感分析:言多必得与言多必失

SmogFarm从事的是基于大数据的情绪分析,衡量.跟踪.聚合数百万人的情绪,然后做出全球第一份衡量群众心理的定量指标-地球脉搏.为什么要这么做?因为数据就是未来,情感是笔大买卖,选举.调查结果.流行新闻故事乃至于股市都会受到"群众"情绪的影响. 言多必得 相比之下,KredStreet则找到了另一个似乎更容易变现的垂直商业模式并已开始进行不公开测试:社会化股票交易员排名(The http://www.aliyun.com/zixun/aggregation/13666.html&qu

基于大数据的资金流量分析:思路与应用前景设想

传统的资金流量分析方法,主要是编制部门之间的资金流量表,并据此展开分析,为宏观经济政策决策提供参考.资金流量表分为实物交易表和金融交易表, 分别统计国民经济各个部门(非金融企业部门.金融机构部门.政府部门.住户部门和国外部门)的资金运用与来源情况.通过引入大数据技术,传统的资金流量分析将面临重塑,并将成为精准宏观调控的基础. 大数据对资金流量分析的拓展与重构 大数据的应用将极大地改变资金流量分析的技术基础,拓展资金流量分析的范围,进而重构资金流量分析的内涵和外延. 首先,大数据的应用将极大地改变

当大数据遇到安全分析:思科OpenSOC即将开源

https://yqfile.alicdn.com/e0c1a2bfa5a8e6291a296afbf2f5deda0d374f93.png" > OpenSOC是大数据分析与安全分析技术的结合大数据与安全分析技术的结合是信息安全市场的热点话题,而思科公司的安全大数据分析框架OpenSOC也在BroCON大会亮相(演讲幻灯片.视频),有迹象表明OpenSOC距离开源已经进入倒计时. 据Solidot报道,今年BroCON上最受广泛关注的议题之一就是OpenSOC,Cisco之前说是准备在2

IDC:银行业和制造业推动全球大数据和业务分析市场双位数增长

据IDC全球半年度大数据和分析开支指南称,全球大数据和业务分析(BDA)的收入将从2016年的1301亿美元增长到2020年的2030亿美元. "数据的可用性.新一代技术.向数据驱动决策转变的文化,这将继续成为对大数据和分析数据及服务需求的推动力,"IDC分析和信息管理副总裁Dan Vesset表示."这个市场在2015年收入达到1220亿美元之后,预计2016年的收入将增长11.3%,并且预计到2020年之前的复合年增长率为11.7%." "推动这一增长

IDC:2017年大数据和业务分析收入将突破1508亿美元

根据IDC半年度全球大数据和分析开支指南,IDC预测大数据和业务分析(BDA)收入到2017年将达到1508亿美元,相比2016年增长12.4%.BDA相关硬件.软件和服务的商业采购预计到2020年前将保持11.9%的复合年增长率,收入将超过2100亿美元. IDC分析和信息管理副总裁Dan Vesset表示:"在经过多年的采用S曲线之后,大数据和业务分析解决方案终于步入了主流.BDA作为决策支持和决策自动化的推动技术,现在已经受到了高层管理者的关注.这一类解决方案也是在全球各行业和业务流程实现

亚马逊CTO:大数据不仅仅是分析

亚马逊CTO Werner Vogels在Cebit上发表的主题演讲称,企业在思考大数据的时候,需要注意的不仅是需要分析大量的数据,还包括信息的存储方式. Vogels的演讲题目是"无限的数据",此外,还鼓励企业思考大容量图片的问题,他还介绍了用于实施大数据系统的http://www.aliyun.com/zixun/aggregation/13888.html">亚马逊云蓝图. Vogels表示:"大数据不仅仅是分析,它是关于整个流程.当你思考大数据的解决方

全球大数据和业务分析收入预计到2019年突破1870亿美元

根据IDC新的全球半年度大数据和分析开支指南,全球大数据和业务分析收入将从2015年的1220亿美元增加到2019年超过1870亿美元,在5年间的增幅超过50%.这个新的开支指南在IDC此前的预期基础上进行了扩展,提供了技术.行业和地区方面的详细收入信息. 在大多数的预测期内,服务相关的商机将在所有大数据和业务分析收入中占到超过一半的份额,IT服务的收入是业务服务年收入的近3倍.软件将是第二大类别,到2019年收入规模将超过550亿美元.其中近一半的收入将来自于最终用户查询.报告.分析工具和数据

大数据:安全分析产品的发展重点

文章讲的是大数据:安全分析产品的发展重点,在本届RSA大会上,业界众多厂商都强调了合理利用大数据以提高安全性的重要性.但在安全领域,大家对大数据仍然持怀疑态度.Enterpirse企业战略集团高级首席分析师Jon Oltsik说道,"对于安全人员而言,这个术语有些模糊,但他们已经开始收集大量数据." 现在已经有很多供应商开始围绕网络取证和风险管理构建大数据解决方案.在RSA大会上,很多供应商(从IBM到Agilliance再到EMC的RSA安全分公司)都推出了利用大数据提高安全性的产品