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

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介: 原文:.NET批量大数据插入性能分析及比较  数据插入使用了以下几种方式 1. 逐条数据插入2. 拼接sql语句批量插入3. 拼接sql语句并使用Transaction4. 拼接sql语句并使用SqlTransaction5.
原文: .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. }  
相关实践学习
简单用户画像分析
本场景主要介绍基于海量日志数据进行简单用户画像分析为背景,如何通过使用DataWorks完成数据采集 、加工数据、配置数据质量监控和数据可视化展现等任务。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps&nbsp;
目录
相关文章
|
2月前
|
数据采集 监控 算法
利用大数据和API优化电商决策:商品性能分析实践
在数据驱动的电子商务时代,大数据分析已成为企业提升运营效率、增强市场竞争力的关键工具。通过精确收集和分析商品性能数据,企业能够洞察市场趋势,实现库存优化,提升顾客满意度,并显著增加销售额。本文将探讨如何通过API收集商品数据,并将这些数据转化为对电商平台有价值的洞察。
|
机器学习/深度学习 人工智能 自然语言处理
|
SQL 消息中间件 分布式计算
两年 .net 开发转型大数据,上岸阿里P6
两年 .net 开发转型大数据,上岸阿里P6
两年 .net 开发转型大数据,上岸阿里P6
|
分布式计算 大数据 测试技术
微软发布 .Net for Apache Spark :用什么语言开发大数据都可以
Apache Spark 是当今最流行的开源大数据处理框架。Spark 用于进行分布式、大规模的数据处理,提供了更高级的编程接口、更高的性能。除此之外,Spark 不仅能进行常规的批处理计算,还提供了流式计算支持。
|
机器学习/深度学习 人工智能 物联网
|
3月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
42 0