【问题标题】:How can I determine the difference between two large datasets?如何确定两个大型数据集之间的差异?
【发布时间】:2011-11-11 12:52:57
【问题描述】:

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

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

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


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

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

这一切都完成后,我将检查旧转储中的所有条目,看看它们在新转储上是否有匹配的记录(即:相同的 ID)。如果没有,请记录更改。

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

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

建议? (注意:这更像是一个性能问题)

【问题讨论】:

  • “因为我可以确定......这应该会使这个速度提高几个数量级”。 “这更像是一个性能问题”。 ...所以在内存中执行此操作会快得多,而且您主要关心的是性能。听起来您回答了自己的问题。

标签: sql xml dataset large-data-volumes


【解决方案1】:

看看 DeltaXML。

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

【讨论】:

    【解决方案2】:
    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
    

    【讨论】:

    • 我知道怎么做,我更关心这样一个查询的性能。
    • @Null 标题询问如何确定差异而不是如何快速完成。此外,您似乎想创建一个循环,那会很糟糕。
    • 你如何建议我在没有循环的情况下加载数据?
    • @Null 使用我写的查询即可。没有循环。
    • 数据在 XML 文件中,而不是数据库中。如果我要使用数据库,我必须在某个时候浏览这些文件。
    【解决方案3】:

    RedGate 的SQL Data Compare

    【讨论】:

      【解决方案4】:

      看看 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();
      

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • 如果记录没有特定的顺序,git可以处理吗(即:不能保证顺序保持不变)?
        • @NullUserException: git 适用于文件结构。如果您正在谈论 Stack Overflow 导出,您可以将每个问题 XML 存储在文件 questionid.xml 中(不确定,从未详细查看导出。)
        • 所有问题都在同一个 XML 文件中...我真的很想避免创建数百万个 xml 文件...
        猜你喜欢
        • 2021-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多