【问题标题】:Efficient way to find count of duplicate records查找重复记录计数的有效方法
【发布时间】:2021-08-31 21:28:13
【问题描述】:

我只有SQL 的基本知识,这是我第一次使用标签 SQL,所以如果我在第一个实例中遗漏了什么,请原谅我。有一个大型数据库,其中一个特别感兴趣的表包含超过 1 亿行。客户端正在使用PostgreSQL 作为数据库。

这个表的结构是这样的(示例数据)表名说table

  biometric_token ID status State_code
1            ABCD  1      A          1
2            ABCD  2      R          2
3            ABCD  3      A          2
4            BCDE  4      A          1
5            DEFG  5      A          2
6            DEFG  6      A          2
7            DEFG  7      A          3
8            FGHI  8      A          4
  • biometric_token 是基于生物特征的ID,我可以放心地假设每个人都是独一无二的,他/她不能伪造它。不用说,此令牌是在其他三列所属的注册过程结束时收集的。
  • ID 是系统生成的唯一 ID,每个人在接近注册时都会获得该 ID。
  • statusapproved - Arejected - R
  • State_code 是个人注册所在州/县的代码。

我需要找出有多少(仅计数)个人(即具有相同 biometric_token)已多次注册。所以输出格式类似于

  count_of_individuals number_of_times
1                    1               3
2                    1               2

解释

  • ABCD注册成功2次
  • DEFG注册成功3次

下面给出了我尝试过的代码(嵌套查询),它可以工作但速度很慢。我需要查找是否有更快的替代方法可以从这个庞大的数据库中成功检索此摘要

SELECT COUNT( DISTINCT biometric_token) AS count_of_individuals, cnt AS number_of_times
FROM

(SELECT biometric_token, count (ID) AS cnt
FROM table
WHERE status IN ('A')
GROUP BY biometric_token
HAVING cnt > 1)

GROUP BY number_of_times

【问题讨论】:

    标签: sql postgresql aggregation


    【解决方案1】:

    我可能还会建议您当前的查询。但是,我们可以尝试将以下索引添加到您的表中:

    CREATE INDEX idx ON yourTable (status, biometric_token);
    

    这个索引应该覆盖整个查询,并且至少允许 Postgres 只需要对包含已批准注册记录的表的子集进行聚合。

    【讨论】:

    • 您能否进一步解释一下,它究竟会做什么以及创建此索引后,我将如何继续或更改我的选择查询
    • @AnilGoyal 对 B 树索引如何在 SQL 中工作的完整解释超出了单个问题/答案的范围。索引status 中的第一列将立即让 Postgres 丢弃除已批准的记录之外的任何记录。第二列 biometric_token 允许 Postgres 单独使用索引进行聚合。
    • 我将如何继续或更改我的选择查询您不必更改您的选择查询。 99% 的时间它会自动使用索引
    猜你喜欢
    • 2017-05-26
    • 1970-01-01
    • 2012-11-15
    • 1970-01-01
    • 2016-01-24
    • 1970-01-01
    • 2014-05-07
    • 2013-10-20
    • 2020-05-14
    相关资源
    最近更新 更多