SqlServer优化之批量插入(SqlBulkCopy表值参数)
Posted 竹林听雨行
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
以上是关于SqlServer优化之批量插入(SqlBulkCopy表值参数)的主要内容,如果未能解决你的问题,请参考以下文章
Myeclipse 如何用java 写sqlserver 的批量插入?