MSSQL批量插入数据优化详细批量插入数据优化详细
需求需求
现在有一个需求是将10w条数据插入到MSSQL数据库中,表结构如下,你会怎么做,你感觉插入10W条数据插入到MSSQL如下的表中需要多久呢?
或者你的批量数据是如何插入的呢?我今天就此问题做个探讨。
压测压测mvc的的http接口看下数据接口看下数据
首先说下这里只是做个参照,来理解插入数据库的性能状况,与开篇的需求无半毛钱关系。
mvc接口代码如下:
public bool Add(CustomerFeedbackEntity m)
{
using (var conn=Connection)
{
string sql = @"INSERT INTO [dbo].[CustomerFeedback] ([BusType] ,[CustomerPhone] ,[BackType] ,[Content] )
VALUES
(@BusType
,@CustomerPhone
,@BackType
,@Content
)";
return conn.Execute(sql, m) > 0;
}
}
压测的此mvc接口单条数据插入数据库的聚合数据图。
用例这样的:5000个请求分500个线程执行post请求接口。
这个图告诉我们,最慢的请求只用啦4毫秒。那么我们做个算法。
如开篇的需求来看,我们用最小的响应时间来计算。
那么插入10w条数据到数据库需用时=100000*4毫秒,大致是6.67分钟。那么我们奔着这个目标来做出插入方案。
最常见的最常见的insert做法做法
首先我们的工程师拿到需求后这样写啦段代码,如下:
//执行数据条数
int cnt = 10 * 10000;
//要插入的数据
CustomerFeedbackEntity m = new CustomerFeedbackEntity() { BusType = 1, CustomerPhone = "1888888888", BackType = 1, Content = "123123dagvhkfhsdjk肯定会撒娇繁华的撒娇防护等级划分
噶哈苏德高房价盛大开放" };
//第一种
public void FristWay()
{
using (var conn = new SqlConnection(ConnStr))
{
conn.Open();
Stopwatch sw = new Stopwatch();
sw.Start();
StringBuilder sb = new StringBuilder();
Console.WriteLine("从:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff") + "开始循环执行:" + cnt + "条sql语句 ...");
for (int i = 0; i <= cnt; i++)
{
sb.Clear();
sb.Append(@"INSERT INTO [dbo].[CustomerFeedback] ([BusType] ,[CustomerPhone] ,[BackType] ,[Content] )
VALUES(");
sb.Append(m.BusType);
sb.Append(",'");
sb.Append(m.CustomerPhone);
sb.Append("',");
sb.Append(m.BackType);
sb.Append(",'");
sb.Append(m.Content);
sb.Append("')");
using (SqlCommand cmd = new SqlCommand(sb.ToString(), conn))
{
cmd.CommandTimeout = 0;
cmd.ExecuteNonQuery();
}
}
Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff") + "时,执行:" + cnt + "条sql语句完成 ! 耗时:" + sw.ElapsedMilliseconds + "毫秒。");
}
}
执行结果如下: