【问题标题】:Looking to find duplicates in large dataset using indexes in SQL [closed]希望使用 SQL 中的索引在大型数据集中查找重复项 [关闭]
【发布时间】:2014-10-26 15:53:15
【问题描述】:

我有一个包含用户和电子邮件的数据库。这是一个非常大的数据集,所以我正在寻找一种比简单的 SELECT 语句更快的方法。我只是想找出哪些用户列出了多个电子邮件地址。我相信我必须这样开始:

CREATE INDEX IX_MyDatabase_Emails
ON MyDatabase (Email ASC)

但老实说,我是索引新手,而且我的 SQL 生锈了,所以不太确定在那之后该怎么做。

【问题讨论】:

  • 您使用的是哪个 DBMS?后格雷斯?甲骨文?

标签: sql database indexing


【解决方案1】:

如果您想计算电子邮件地址,那么聚合是最快的方法。如果您想开始吐出有重复的电子邮件,那么在许多数据库中,以下方法会更快:

select uet.user
from user_email_table uet
where exists (select 1
              from user_email_table uet2
              where uet2.user = uet.user and uet2.email <> uet2.email
             );

为了提高性能,您需要在user_email_table(user, email) 上建立索引。

这将返回重复项。 select distinct 将增加处理时间。

通过“多个”电子邮件地址,我假设您想要 不同 电子邮件地址。这就是这两个查询的区别:

select user, count(*)
from user_email_table
group by user
having count(*) > 1;

和:

select user, count(distinct email)
from user_email_table
group by user
having count(distinct email) > 1;

【讨论】:

    【解决方案2】:

    SQL 有两个方面。对表进行操作的语句(SELECT、UPDATE、DELETE 和 INSERT)。还有定义数据结构的语句。

    索引组织磁盘上的数据以提高选择语句的速度。索引是定义数据结构的语句。从你的陈述来看,你的索引应该是这样的:

    CREATE INDEX IX_MyDatabase_Emails
    On MyDatabase.user_email_table (Email ASC)
    

    如果您的 SELECT 语句执行时间过长,索引将是一个很好的解决方案。您可能希望为用户创建一个索引,因为您正在寻找具有多个电子邮件地址的用户。

    计算电子邮件地址的 SELECT 语句是:

    SELECT user, COUNT(emails)
    FROM user_email_table
    GROUP BY user
    HAVING COUNT(emails) > 1
    

    【讨论】:

      猜你喜欢
      • 2019-03-29
      • 2017-06-22
      • 2023-04-08
      • 2017-08-23
      • 2017-05-24
      • 1970-01-01
      • 2021-06-21
      • 2013-04-17
      • 1970-01-01
      相关资源
      最近更新 更多