有没有有效的解决方案/方法?

时间:2016-07-03 14:56:16

标签: c# sql-server winforms ado.net

我正在创建一个工具,它将两个数据库作为输入,比较表并在表中显示“仅数据的差异”。

例如,
来源数据库 - 人,订单(两个表)
目的地数据库 - 人员,订单(两个表)

现在,我的应用程序将源数据库中的Person与目标数据库中的Person进行比较,并仅显示源Person中而不是目标Person中的那些记录。

这是我的方法 -

  1. 将两个数据库加载到两个DataSet中(源数据集, destinatioin DataSet)。
  2. 逐行比较两个表格。
  3. 如果发现任何更改发现像源头中的行不在目标人员中,则将这些行插入目标人员。
  4. 我的问题:有没有更好/更有效的方法来实现这一目标?

    迭代整个数据库是效率最低的解决方案。

2 个答案:

答案 0 :(得分:1)

通常最好将工作推入数据库。为每对表生成FULL OUTER JOIN查询以计算服务器上的差异。到目前为止 比将所有数据传输到客户端更快

特别是数据表等效率不高。

另一种方法是行排序的请求,并在两个结果流上执行内存中的合并连接。您可以找到有关如何在Web上合并两个已排序流的示例代码。

答案 1 :(得分:1)

通常,您希望尽可能多地在数据库中进行处理。对于要读取表的全部内容的处理尤其如此。关系数据库是为这种类型的处理而设计的。

如果两个数据库都在同一台服务器上,那么您可能会有这样的查询来获取源中不在目标中的人员记录:

select s.*
from source..person
except
select d.*
from destination..person;

这种方法的优点是什么?

  • SQL Server可以使用多个线程运行查询。
  • SQL Server可以使用索引(尽管这可能不适合此特定查询)。
  • SQL Server仅返回应用程序所需的数据。

如果它们不在同一台服务器上,则可以使用链接服务器连接服务器。 documentation是了解如何使用链接服务器的好地方。如果服务器使用不同的数据库,这甚至可以工作。