【问题标题】:Find duplicates in table without primary key在没有主键的表中查找重复项
【发布时间】:2022-11-18 02:50:01
【问题描述】:

我有一个包含三个字段的表。第一个字段 - 具有 varchar 数据类型 - 是客户的号码 (c_number),其他两个也是 varchar - 客户的名字和姓氏(c_first_name 和 c_last_name)。

该表没有单独的主键。但是有相同c_number字段的重复项(例如,对于相同的客户,但是名字和姓氏写在不同的寄存器中)

表中的记录数相当大——大约一百万。

需要显示所有重复次数大于N次的客户。

这是正面解决问题的代码:

Select *
COUNT(c_number) as c
GROUP BY c_number
HAVING (c > N) ;

但是这种方法似乎很慢。我的解决方案是添加索引:

CREATE INDEX idx_c_number 
ON TABLENAME(c_number);

之后,如果我理解正确,就可以执行表达式来实时搜索重复项。 如果仍然不是这种情况,请告诉我找到具有最佳性能的重复项的最佳解决方案(记住我们仍然没有主键这一事实)

【问题讨论】:

    标签: sql postgresql duplicates


    【解决方案1】:

    实际上,“一百万条记录”不是被认为是“大”了......

    是的,索引将使您能够使用您所描述的查询,并在速度上有合理的提高。“但是,要付出代价……”

    虽然有些人认为在表上设置主键是“必要的”或至少是“习惯的”,但这完全取决于您。例如,一些表基本上只是“事件或事务日志”,您永远不会利用引用它们的“主键”。如果你永远不会使用一个,你就不需要一个。它不会以任何方式影响“索引”。

    现在,通过创建这个索引,您将要介绍一个长期成本:今后必须维持该指数。这将引入额外的成本予取予求插入或删除记录,或更新索引值。因此,虽然这当然会使当前查询“更快”,但它不是免费的。 “相应地计划。”只有您可以决定什么是最适合您的。由于影响更大,我鼓励您在继续之前与您的同事讨论此事。

    【讨论】:

      猜你喜欢
      • 2016-10-18
      • 1970-01-01
      • 1970-01-01
      • 2013-05-09
      • 2019-03-21
      • 1970-01-01
      • 2017-07-13
      • 2013-02-21
      相关资源
      最近更新 更多