2016-04-08 20 views
0

我有一个ETL过程/作业,以预定的方式从源向目标提取数据库数据。用于比较两组数据(新vs现有)的推荐模式/策略...剩余的新数据不存在

  1. [Source data]定期更新来自某些外部 源的新数据。 [Destination data]是业务下游 使用的[Source data]的子集。
  2. [Destination data]约束的要求是,它应该 不能有重复(一些数据后,可以进口的,那么新的提取运行时,可能会发生,例如,在工作 故障的情况下)
  3. 作业进口1000只记录在一个时间
  4. 的计划/工作还有其他的责任,它适用于

我的一个“可行的”选项的其他数据包括:

  • 获取ALL预计复合/键列从目的地
  • 做新1000条装载的记录(还是很多的 记录)的比较。
  • 然后保存不在 [Destination Data]中的新[Source data]
  • 我想象一下,包含现有[Destination data]的数据结构将是以下结构的Hashset,例如,HashSet<int,string,string>。 3个数据项唯一标识一条记录。
  • 然后,我会得到1000条记录,通过它们循环,与HashSet进行比较。

我担心在内存中的数据太多。

任何关于更好方法的建议,还是这是最有效的方法呢?

回答

0

只是为了分享,我发现了一个类似的问题和一个全面的答案。它使用Java,但很容易转换为C#。

仍然对任何替代品开放。否则将标记为答案并表示为重复。


...我们可以按照升序通过其ID的所有元素(一次性O(n log n)成本)进行排序,并使用O(n)算法,只要他们是比当前一个跳过的元素在他们迭代元素来自另一个序列。这更好,但仍不是最佳。

最佳解决方案是创建bs集合的ID的哈希集合。这不需要对两个集合进行排序,并且允许线性时间成员资格测试。一次性组装这些ID的成本是O(n)

HashSet<Integer> bIds = new HashSet<>(bs.size()); 
for (B b : bs) 
    bIDs.add(b.getId()); 

for (A a : as) 
    if (bIds.contains(a.getId())) 
     cs.add(a); 

该解决方案的总体复杂度为O(|as| + |bs|)

https://softwareengineering.stackexchange.com/a/258325/132218

相关问题