以下内容大部分来自:
http://blog.csdn.net/tjvictor/article/details/4360030
部分内容出自互联网,实验结果为亲测。
最近自己开发一个向数据库中插入大量历史数据的函数库,需要解决一个大数据量插入的效率问题。不用分析,我知道如果采取逐条数据插入的方式,那么效率肯定很低,光是那么多循环就知道很慢了。于是乎,我找到了上篇博客,知道了BulkCopy和TVPs方式。为了更好的了解其效率,我自己动手亲测了一下效果,测试的数据库位于本机。
(1)方式1:循环插入
public static void NormalInerst(String connString) { Console.WriteLine("使用NNormalInerst方式:"); Stopwatch sw = new Stopwatch(); SqlConnection sqlConn = new SqlConnection(connString); SqlCommand sqlCmd = new SqlCommand(); sqlCmd.CommandText = String.Format("insert into BulkTestTable(Id,UserName,Pwd)values(@p0,@p1,@p2)"); sqlCmd.Parameters.Add("@p0", SqlDbType.Int); sqlCmd.Parameters.Add("@p1", SqlDbType.NVarChar); sqlCmd.Parameters.Add("@p2", SqlDbType.VarChar); sqlCmd.CommandType = CommandType.Text; sqlCmd.Connection = sqlConn; sqlConn.Open(); try { for (int i = 0, j = 0; i < 10; ++i ) { for (j = i * 10000; j < (i + 1) * 10000; ++j ) { sqlCmd.Parameters["@p0"].Value = j; sqlCmd.Parameters["@p1"].Value = String.Format("User-{0}", i * j); sqlCmd.Parameters["@p2"].Value = String.Format("Pwd-{0}", i * j); sw.Start(); sqlCmd.ExecuteNonQuery(); sw.Stop(); } Console.WriteLine("第{0}次插入{1}条数据耗时:{2}", (i + 1), dataScale, sw.ElapsedMilliseconds); sw.Reset(); } } catch (System.Exception ex) { throw ex; } finally { sqlConn.Close(); } }