我有large datasets数百万条XML格式的记录。这些数据集是数据库的完整数据转储,直到某个时间点。
在两个转储之间可能添加了新条目,并且可能已修改或删除了现有条目。假设架构保持不变,并且每个条目都有唯一的ID。
确定其中两个数据集(包括删除和更新)之间的差异的最佳方法是什么?
我的计划是将所有内容加载到RDBMS并从那里开始。
首先,加载旧转储。然后,将较新的转储加载到不同的模式,但这样做,我将检查条目是新的还是对现有条目的更新。 如果是,我会将ID记录在名为“更改”的新表上。
完成所有操作后,我将浏览所有条目的旧转储,看看它们是否在新转储上有匹配的记录(即:相同的ID)。如果没有,请记录更改。
假设通过ID查找记录是O(log n)
操作,这应该允许我在O(n log n)
时间内完成所有操作。
因为我可以通过查看只有ID和最后修改日期的记录的存在与否来确定差异,我也可以在主存中加载所有内容。时间复杂度将是相同的,但具有更少的磁盘I / O的额外好处,这应该使这个速度提高几个数量级。
连连呢? (注意:这不仅仅是一个性能问题)
答案 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