如何确定两个大型数据集之间的差异?

时间:2011-09-06 17:35:49

标签: sql xml dataset large-data-volumes

我有large datasets数百万条XML格式的记录。这些数据集是数据库的完整数据转储,直到某个时间点。

在两个转储之间可能添加了新条目,并且可能已修改或删除了现有条目。假设架构保持不变,并且每个条目都有唯一的ID。

确定其中两个数据集(包括删除和更新)之间的差异的最佳方法是什么?


我的计划是将所有内容加载到RDBMS并从那里开始。

首先,加载旧转储。然后,将较新的转储加载到不同的模式,但这样做,我将检查条目是新的还是对现有条目的更新。 如果是,我会将ID记录在名为“更改”的新表上。

完成所有操作后,我将浏览所有条目的旧转储,看看它们是否在新转储上有匹配的记录(即:相同的ID)。如果没有,请记录更改。

假设通过ID查找记录是O(log n)操作,这应该允许我在O(n log n)时间内完成所有操作。

因为我可以通过查看只有ID和最后修改日期的记录的存在与否来确定差异,我也可以在主存中加载所有内容。时间复杂度将是相同的,但具有更少的磁盘I / O的额外好处,这应该使这个速度提高几个数量级。

连连呢? (注意:这不仅仅是一个性能问题)

5 个答案:

答案 0 :(得分:1)

RedGate的SQL Data Compare

答案 1 :(得分:1)

看看DeltaXML。

(填充因为StackOverflow不允许简短回答)

答案 2 :(得分:0)

作为一个不寻常的建议,请考虑使用git。将第一个数据集置于版本控制之下,然后清理工作目录并复制到第二个数据集中。 git在提出差异方面非常快。

答案 3 :(得分:0)

查看MSDN上的这篇文章,它提供了获取两个DataTable之间差异的解决方案。它应该指向正确的方向:

如何比较两个DataTable:
http://social.msdn.microsoft.com/Forums/en/csharpgeneral/thread/23703a85-20c7-4759-806a-fabf4e9f5be6

您可能也想看看这个SO问题:
Compare two DataTables to determine rows in one but not the other

我也看过这种方法使用了几次:

table1.Merge(table2);
DataTable changesTable = table1.GetChanges();

答案 4 :(得分:0)

select
    coalesce(a.id, b.id) as id,
    case 
        when a.id is null then 'included' 
        when b.id is null then 'deleted'
        when a.col != b.col then 'updated'
    end as status
from a
full outer join b on a.id = b.id
where a.id is null or b.id is null or a.col != b.col