我想插入大約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;
}
}
}
方法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;
}
}
}
答案在於代碼本身。在第一種方法中,您正在從您的應用程序到SQL進行多個調用。在2方法中,您使用查詢進行單一調用。運行SQL Profiler,您將會了解其中的差異。 – sajoshi 2011-03-01 07:38:24
可能是一個愚蠢的問題,但你看看這個:[使用DataAdapter(ADO.NET)執行批處理操作](http://msdn.microsoft.com/en-us/library/aadf8fk2.aspx)。這基本上是你在第二種方法中所做的,只是更正確。 – R0MANARMY 2011-03-01 19:16:24
感謝羅馬納米你回答了它 – 2011-03-02 03:39:38