我正在开发一个Web API和实体框架6,它在任何给定时间对Microsoft SQL Server表执行500个以下记录的“批量”插入。 DbContext.SaveChanges()方法将在几秒钟内将所有记录插入到表中,因此没有任何问题。但是,当调用该方法将相同数量的记录插入到同一个表中且附加了半广泛触发器时,该过程可能需要很长时间。触发器对表连接有一些调用并插入到其他表中,然后删除新插入的记录。
我对表格或触发器没有多少控制权,因此我正在寻找有关如何提高性能的建议。我建议将触发器移动到存储过程并让触发器调用存储过程,但我不确定是否会获得任何收益。
编辑:据我所知,我的问题是通用的,我会发布一些代码以防万一。 SQL不是我的,所以我会看到我实际发布的内容。
以下是我调用SaveChanges()的Web API方法的一部分:
string[] stringArray = results[0].Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None);
var profileObjs = db.Set<T_ProfileStaging>();
foreach (var s in stringArray)
{
string[] columns = s.Split(new[] {",", "\t"}, StringSplitOptions.None);
if (columns.Length == 6)
{
T_ProfileStaging profileObj = new T_ProfileStaging();
profileObj.CompanyCode = columns[0];
profileObj.SubmittedBy = columns[1];
profileObj.VersionName = columns[2];
profileObj.DMName = columns[3];
profileObj.Zone = columns[4];
profileObj.DMCode = columns[5];
profileObj.ProfileName = columns[6];
profileObj.Advertiser = columns[7];
profileObj.OriginalInsertDate = columns[8];
profileObjs.Add(profileObj);
}
}
try
{
db.SaveChanges();
return Ok();
}
catch (Exception e)
{
return Content(HttpStatusCode.BadRequest, "SQL Server Insert Exception");
}
答案 0 :(得分:0)
使用SaveChanges()加载时,EF将在单独的INSERT语句中发送每一行。因此,如果您有一个语句触发器,它将为每一行运行。
要解决此问题,您需要
或