通过.Net C#应用程序更新大量数据的最快方法是什么

时间:2015-12-14 06:25:10

标签: c# asp.net .net

我正在开发一个从两个不同数据库(即Database1.Table1和Database2.Table2)获取数据的应用程序,然后比较这两个表(仅与主键(即ID)进行比较)并从Database1.Table1中插入行如果Database2.Table2中不存在Database2.Table2

问题在于存在大量数据(两个表中约为80万),并且在比较中需要花费大量时间。有没有办法快速做到这一点

注意:我在C#中使用Datatable来比较表格代码如下:

DataTable Database1_Table1;// =  method to get all data from Database1.Table1
DataTable Database2_Table2;// =  method to get all data from Database2.Table2

foreach (DataRow row in Database1_Table1.Rows) //(var GoodClass in Staging_distinct2)
            {
                if (Database2_Table2.Select("ID=" + row["ID"]).Count() < 1)
                {
                    sqlComm = new SqlCommand("Delete from Database1.Table1 where Id=" + row["ID"], conn);
                    sqlComm.ExecuteNonQuery();
                    sqlComm = new SqlCommand("INSERT INTO Database2.Table2 Values (@ID,@EmpName,@Email,@UserName)", conn);
                    sqlComm.Parameters.Add("@ID", SqlDbType.Int).Value = row["ID"];
                    sqlComm.Parameters.Add("@EmpName", SqlDbType.VarChar).Value = row["EmpName"];
                    sqlComm.Parameters.Add("@Email", SqlDbType.VarChar).Value = row["Email"];
                    sqlComm.Parameters.Add("@UserName", SqlDbType.VarChar).Value = row["UserName"];
                    sqlComm.ExecuteNonQuery();
                    totalCount++;
                    added++;
                }
                else
                {
                    deleted++;
                    totalCount++;
                }
            }

3 个答案:

答案 0 :(得分:1)

批量更新/插入是最快的方法。 (sqlbulk copy)

http://www.jarloo.com/c-bulk-upsert-to-sql-server-tutorial/

答案 1 :(得分:1)

将此SQL从您的应用程序提交到数据库:

   INSERT INTO Database1..Table1 (Key, Column1,Column2)
   SELECT Key, Column1,Column2 
   FROM Database2..Table2
   WHERE NOT EXISTS (
      SELECT * FROM Database1..Table1 
      WHERE Database1..Table1.Key = Database1..Table2.Key
   )

它会将列Key上不匹配的所有行从Database..Table2复制到Database..Table1

它将在数据库服务器上执行。没有不必要的往返数据。没有RBAR(行通过Agonizing Row)。唯一的缺点是你无法获得进度条 - 异步进行。

答案 2 :(得分:0)

处理此问题的最佳方法是批量插入临时表,然后从该临时表发出合并语句到生产表中。我每天都有数百万行没有问题。我在我的博客C# Sql Server Bulk Upsert

上有一个技术示例