我想插入大约3000条记录,当我按方法1进行时需要大约2分钟才能完成,但是如果我使用方法2插入完成的时间少于秒.虽然方法2不遵循良好的做法,但它给我带来了良好的性能提升.想了解为什么方法1需要花费很多时间,并且有更好的方法可以做到这一点
方法1:
public static void InsertModelValue(DataSet employeData, int clsaId)
{
var query = @"INSERT INTO employee (id, name)
VALUES (@id, @name)";
using (var connection = GetOdbcConnection())
{
connection.Open();
var tran = connection.BeginTransaction();
try
{
foreach (DataRow row in employeData.Tables[0].Rows)
{
using (var cmd = new OdbcCommand(query, connection, tran))
{
cmd.Parameters.Add("@id", OdbcType.VarChar).Value = row["ID"];
cmd.Parameters.Add("@name", OdbcType.Int).Value = Convert.ToInt32(row["Name"]);
cmd.ExecuteNonQuery();
}
}
tran.Commit();
}
catch
{
tran.Rollback();
throw;
}
}
}
Run Code Online (Sandbox Code Playgroud)
方法2:
public static void InsertModelValueInBulk(DataSet employeData, int clsaId, int batchSize)
{
string[] insertStatement = new string[batchSize];
using (var connection = GetOdbcConnection())
{
connection.Open();
var tran = connection.BeginTransaction();
try
{
int j = 0;
for (int i = 0; i < employeData.Tables[0].Rows.Count; i++)
{
var row = employeData.Tables[0].Rows[i];
var insertItem = string.Format(@"select '{0}',{1}", row["name"], Convert.ToInt32(row["ID"]);
insertStatement[j] = insertItem;
if (j % (batchSize-1) == 0 && j > 0)
{
var finalQuery = @" INSERT INTO employee (id, name)
" + String.Join(" union ", insertStatement);
using (var cmd = new OdbcCommand(finalQuery, connection, tran))
{
cmd.ExecuteNonQuery();
}
j = 0;
continue;
}
else
{
j = j + 1;
}
}
if (j > 0)
{
var finalQuery = @"INSERT INTO employee (id, name)
" + String.Join(" union ", insertStatement,0,j-1);
using (var cmd = new OdbcCommand(finalQuery, connection, tran))
{
cmd.ExecuteNonQuery();
}
}
tran.Commit();
}
catch
{
tran.Rollback();
throw;
}
}
}
Run Code Online (Sandbox Code Playgroud)
Eri*_*ert 26
您想在您的银行帐户中存入三千美元.哪个更快:
要么
?
应该相当明显的是,第一个比第二个慢很多.现在很清楚为什么第一种技术比第二种技术慢几百倍?