以三萬條數據爲例:
Dapperr的Excute方法執行插入語句的本質是一條一條的插入,當數據量非常大是會很慢,三萬條用了十幾分鍾
將一組數據一塊插入就會相當的快,三萬條用了12秒
優化前的批量導入:
//_vfsContext.Conn.Open();
//var tran = _vfsContext.Conn.BeginTransaction(IsolationLevel.Serializable);
//Stopwatch stopwatch = new Stopwatch();
//stopwatch.Start();
//var inserSql = $@"insert into tm_receiveconfirm(ConfirmStamp,OrderNo,InsertTime)
// values(@ConfirmStamp,@OrderNo,@InsertTime)";
//_vfsContext.Conn.Execute(inserSql, tmList, tran);
//tran.Commit();
//stopwatch.Stop();
優化後的批量導入:
//組織數據
for (var i = 0; i < OrderNos.Count; i++)
{
tmList.Add(new tm_receiveconfirm()
{
OrderNo = OrderNos[i],
ConfirmStamp = uniqueId,
InsertTime = DateTime.Now
});
}
//臨時表插入數據
//拼接sql
var strsql = new StringBuilder();
strsql.Append("insert into tm_receiveconfirm(ConfirmStamp,OrderNo,InsertTime) values ");
foreach (var item in tmList)
{
strsql.AppendFormat("('{0}','{1}','now()'),", uniqueId, item.OrderNo);
}
var inserSql = strsql.ToString();
var sql=inserSql.Substring(0, inserSql.LastIndexOf(','));
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
log.Info($"{sql}");
_vfsContext.Conn.Execute(sql, null);
stopwatch.Stop();
log.Info($"數據插入臨時表end:{stopwatch.ElapsedMilliseconds}");