SqlServer优化之批量插入(SqlBulkCopy、表值参数)

之前做项目需要用到数据库的批量插入,于是就研究了一下,现在做个总结。

创建了一个用来测试的Student表:

1 CREATE TABLE [dbo].[Student](
2 [ID] [int] PRIMARY KEY NOT NULL,
3 [Num] [varchar](10) NULL,
4 [Name] [nvarchar](64) NULL,
5 [Age] [int] NULL
6 )

一、SqlBulkCopy类:使用数据库BCP协议进行数据的批量复制,每一批的数量大约800条。

复制代码
 1 /// <summary>
 2 /// 批量插入SqlBulkCopy
 3 /// </summary>
 4 /// <param name="dt"></param>
 5 /// <param name="tableName">表名</param>
 6 public static void BatchInsertBySqlBulkCopy(DataTable dt, string tableName)
 7 {
 8 using (SqlBulkCopy sbc = new SqlBulkCopy(connString))
 9 {
10 sbc.BatchSize = dt.Rows.Count;
11 sbc.BulkCopyTimeout = 10;
12 sbc.DestinationTableName = tableName;
13 for (int i = 0; i < dt.Columns.Count; i++)
14 {
15 sbc.ColumnMappings.Add(dt.Columns[i].ColumnName, i);
16 }
17 //全部写入数据库
18 sbc.WriteToServer(dt);
19 }
20 }
复制代码

 

5万条数据插入花了2秒的时间:

 


二、表值参数:也叫表变量参数,使用用户定义的表类型来声明,简单理解就是可以把一个表当做参数传递。

1 CREATE TYPE [dbo].[mytb_student] AS TABLE(
2 [ID] [int] NOT NULL,
3 [Num] [varchar](10) NULL,
4 [Name] [nvarchar](64) NULL,
5 [Age] [int] NULL
6 )

 

 

 

复制代码
/// <summary>
/// 批量插入使用表值参数
/// </summary>
/// <param name="dt"></param>
public static void BatchInsertByTableValue(DataTable dt, string sqlText)
{
using (SqlConnection sqlConn = new SqlConnection(connString))
{
using (SqlCommand sqlCmd = new SqlCommand(sqlText, sqlConn))
{
//把DataTable当做参数传入
SqlParameter sqlPar = sqlCmd.Parameters.AddWithValue("@dt", dt);
//指定表值参数中包含的构造数据的特殊数据类型。
sqlPar.SqlDbType = SqlDbType.Structured;
sqlPar.TypeName = "dbo.mytb_student";//表值参数名称
sqlConn.Open();
sqlCmd.ExecuteNonQuery();
}
}
}
复制代码

同样插入5万条数据,也是花了2秒的时间。

 

 

总结:SqlServer数据库批量插入除了使用SqlBulkCopy和表值参数,还可以使用SqlDataAdapter的Update方法,经过本人测试,在数据量越大的情况下,使用SqlBulkCopy的性能是最好的。
————————————————
版权声明:本文为CSDN博主「chwenbin」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chwenbin/article/details/79112570

posted @   竹林听雨行  阅读(578)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示