首页 文章

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

提问于
浏览
0

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

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

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

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

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

有人想过吗?

1 回答

  • 0

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

    • 指纹是根据表格的一个键(可能是PK,也可能是候选PK)计算的 . 如果没有,那就毫无意义(* 1) . 所以指纹是不变的 .

    • 此外,每个表格的每个指纹都是唯一的(如果不是则会遇到大麻烦) .

    • 理想情况下,我会将指纹添加到每个表中作为新属性(NOT NULL UNIQUE),在创建行时由触发器设置 . 如果表格不是太大且功能不太占用CPU,则可以更改数据库功能,以计算要在选择中使用的指纹 .

    • 如果无法修改原始表,则需要辅助表 . 您可以使用建议的唯一表,也可以使用每个原始表的一个表(fingerprintA,pkA / fingerprintB,pkB) . 您的解决方案可能更快,我的更简单(只插入/删除,无更新)和更多可扩展(如果明天出现表C) . 此/ es table / s的记录仅通过原始表中的插入或删除操作(理想情况下通过触发器)进行修改 .

    • 与每个工程一样,问题的细节(您希望对解决方案做什么以及您能做什么)将 balancer 提供给另一个解决方案 .

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

相关问题