我有一个用于存储数据的asp.net MVC 5应用程序。 10个不同的excel文件中总共有约8,500万条记录。我上传一个excel文件,系统将文件中的记录存储到我的数据库中。但是,这需要很多时间,65K记录大约需要1个小时左右。有什么办法可以加快速度吗?这些速度正常吗?
该应用程序托管在我的本地主机上,因此互联网速度不是问题。我检查了一下,系统每秒写大约15条记录。
我正在将MVC 5与MS SQL一起使用。从文件读取并写入excel的代码是:
//Reads excel file using ExcelDataReader Package
var dataTable = result.Tables[0];
//Read each row one by one
for (var i = 0; i < dataTable.Rows.Count; i++)
{
//Read Properties
var FName = dataTable.Rows[i][0].ToString().Trim(); //First Name
//This goes on, I have 11 properties
//Create DbEntity
var dbEntity = new DbEntity
{
FirstName = FName,
//Do the same for all other properties
};
var entities = db.DbEntities.Where(d => d.Phone == dbEntity.Phone).ToList();
if (entities.Count() > 0)
{
//If it is duplicate, set IsDuplicate to true
dbEntity.IsDuplicate = true;
//Set occurance = count(entities) + 1
dbEntity.Ocurance = entities.Count() + 1;
}
else
{
//If the entity is unique, set IsDuplicate to false
dbEntity.IsDuplicate = false;
//Set the occurance to 1
dbEntity.Ocurance = 1;
}
//Set WasSent to false
dbEntity.WasSent = false;
//Add Entity to records
if(dbEntity.Phone.Length == 10)
{
db.DbEntities.Add(dbEntity);
db.SaveChanges();
++validCount;
}
else
{
//If record is not valid, skip it and add it to invalidRec list
invalidRecs.Add(dbEntity);
}
}
reader.Close();
//Sending result data to View
var data = new ImportResultViewModel
{
ValidCount = validCount,
InvalidList = invalidRecs
};
return View("ImportResult",data);
}
如您所见,我将每条记录一一添加。如果将所有有效记录保留在一个列表中,然后最后将整个列表添加到数据库中,会更好吗?这样会改善性能吗?
答案 0 :(得分:2)
在这种情况下,我强烈建议至少在此功能方面不要使用Entity Framework。在纯SQL / Ado.Net中,您可以使用BulkInsert来在几秒钟内处理您的请求,对于事务而言,85k并不重要,尤其是在您的SQL Server甚至具有相当好的规格的情况下。
似乎已经弃用了另一个Nuget软件包(我仍在生产代码中使用它,但我也对代码进行了审核)。https://libraries.io/nuget/SqlBulkTools。
我有信心在生产中使用它,但是每个人的参数都不同。如果您真的想挤出性能并喜欢ADO.Net(原始),仍然可以使用两个选项:
(批量复制)https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/single-bulk-copy-operations
或