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

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

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

CREATE TABLE [dbo].[Student](
	[ID] [int] PRIMARY KEY NOT NULL,
	[Num] [varchar](10) NULL,
	[Name] [nvarchar](64) NULL,
	[Age] [int] NULL
	)


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

 /// 
        /// 批量插入SqlBulkCopy
        /// 
        /// 
        /// 表名
        public static void BatchInsertBySqlBulkCopy(DataTable dt, string tableName)
        {
            using (SqlBulkCopy sbc = new SqlBulkCopy(connString))
            {
                sbc.BatchSize = dt.Rows.Count;
                sbc.BulkCopyTimeout = 10;
                sbc.DestinationTableName = tableName;
                for (int i = 0; i < dt.Columns.Count; i++)
                {
                    sbc.ColumnMappings.Add(dt.Columns[i].ColumnName, i);
                }
                //全部写入数据库
                sbc.WriteToServer(dt);
            }
        }
5万条数据插入花了2秒的时间:



SqlServer优化之批量插入(SqlBulkCopy、表值参数)_第1张图片

二、表值参数:也叫表变量参数,使用用户定义的表类型来声明,简单理解就是可以把一个表当做参数传递。
CREATE TYPE [dbo].[mytb_student] AS TABLE(
	[ID] [int] NOT NULL,
	[Num] [varchar](10) NULL,
	[Name] [nvarchar](64) NULL,
	[Age] [int] NULL
)

SqlServer优化之批量插入(SqlBulkCopy、表值参数)_第2张图片

 /// 
        /// 批量插入使用表值参数
        /// 
        /// 
        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、表值参数)_第3张图片
总结:SqlServer数据库批量插入除了使用SqlBulkCopy和表值参数,还可以使用SqlDataAdapter的Update方法,经过本人测试,在数据量越大的情况下,使用SqlBulkCopy的性能是最好的。

你可能感兴趣的:(数据库)