同时添加数百万条记录

时间:2018-09-19 20:37:57

标签: asp.net-mvc

我有一个用于存储数据的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);
            }

如您所见,我将每条记录一一添加。如果将所有有效记录保留在一个列表中,然后最后将整个列表添加到数据库中,会更好吗?这样会改善性能吗?

1 个答案:

答案 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

(批处理数据表适配器)https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/performing-batch-operations-using-dataadapters