我正在开发一个从两个不同数据库(即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++;
}
}
答案 0 :(得分:1)
批量更新/插入是最快的方法。 (sqlbulk copy)
答案 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
上有一个技术示例