在两个非常大的数据库表中查找公共条目

时间:2011-07-10 12:43:01

标签: java database algorithm join

我有两个非常大的表,包含数百万个条目,它们包含类似的记录。因此,TableA可能具有与TableB不同的列结构来存储相同的数据,但TableA和TableB都包含用于记录的唯一指纹的列。找出TableA和TableB中包含相同指纹的常用条目的最佳方法是什么?这里有几次问过类似的问题,但这里有一个变化。

说,我将公共条目的pk存储在TableC(pk_a, pk_b, fingerprint)中,它表示TableA和TableB中的公共元组。现在,只要在TableA或TableB中添加/删除记录,就需要更新TableC。

我对第一部分的解决方案是将TableA和TableB的连接与指纹相同并将其添加到TableC。

对于第二部分,查询TableC以获取类似指纹,然后在找到任何匹配项时更新TableC。如果未找到匹配项,则扫描表B(说记录已添加到TableB)以获取指纹,然后更新TableC。

但这非常直观且天真。我觉得可以用更好的方式完成。

有人想过吗?

1 个答案:

答案 0 :(得分:0)

首先我会告诉你我是如何看待这个问题的:

  • 指纹是根据表格的一个键(可能是PK,也可能是候选PK)计算的。如果没有,那就毫无意义(* 1)。所以指纹是不变的。
  • 此外,每个表格的每个指纹都是唯一的(如果不是,则会遇到大麻烦)。
  • 理想情况下,我会将指纹添加到每个表中作为新属性(NOT NULL UNIQUE),在创建行时由触发器设置。如果表格不是太大而且功能不太占用CPU,则可以更改数据库函数,以计算要在选择中使用的指纹。
  • 如果无法修改原始表,则需要辅助表。您可以使用建议的唯一表,也可以使用每个原始表的一个表(fingerprintA,pkA / fingerprintB,pkB)。您的解决方案可能更快,我的更简单(只插入/删除,无更新)和更多可扩展(如果明天出现表C)。只有原始表中的插入或删除操作(最好是通过触发器)修改此/ es table / s的记录。
  • 与每一项工程一样,问题的细节(您希望对解决方案做什么,以及您能做什么)将平衡提供给另一种解决方案。

(* 1)如果您可以通过更改不属于PK的属性来更改您的记录,那么您的模型是错误的。