查找重复记录计数的有效方法
Efficient way to find count of duplicate records
我只有 SQL
的基础知识,这是我对标签 SQL 的第一次了解,所以如果我一开始遗漏了什么,请原谅我。有一个大型数据库,其中一个 table 特别令人感兴趣,它包含超过 1 亿行。客户端正在使用 PostgreSQL
作为数据库。
这个table的结构是这样的(示例数据)table name say 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,我可以放心地假设每个人都是独一无二的,he/she 无法伪造它。不用说,此令牌是在其他三列所属的注册过程结束时收集的。
ID
是系统在 he/she 接近注册时为每个人生成的唯一 ID。
status
是 approved - A
或 rejected - R
。
State_code
是个人注册的state/county的代码。
我需要的是找出有多少(仅计数)个人(即具有相同 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
我可能还会建议您当前的查询。但是,我们可以尝试将以下索引添加到您的 table:
CREATE INDEX idx ON yourTable (status, biometric_token);
这个索引应该覆盖整个查询,并且至少允许 Postgres 只需要聚合 table 的一个子集,其中包含已批准的注册记录。
我只有 SQL
的基础知识,这是我对标签 SQL 的第一次了解,所以如果我一开始遗漏了什么,请原谅我。有一个大型数据库,其中一个 table 特别令人感兴趣,它包含超过 1 亿行。客户端正在使用 PostgreSQL
作为数据库。
这个table的结构是这样的(示例数据)table name say 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,我可以放心地假设每个人都是独一无二的,he/she 无法伪造它。不用说,此令牌是在其他三列所属的注册过程结束时收集的。 ID
是系统在 he/she 接近注册时为每个人生成的唯一 ID。status
是approved - A
或rejected - R
。State_code
是个人注册的state/county的代码。
我需要的是找出有多少(仅计数)个人(即具有相同 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
我可能还会建议您当前的查询。但是,我们可以尝试将以下索引添加到您的 table:
CREATE INDEX idx ON yourTable (status, biometric_token);
这个索引应该覆盖整个查询,并且至少允许 Postgres 只需要聚合 table 的一个子集,其中包含已批准的注册记录。