用于检索数百万数据的 COUNT(DISTINCT column_name) 的替代方法

Alternative to COUNT(DISTINCT column_name) for retrieving millions of data

我有一个存储超过 1000 万条数据的 table,当我使用

等简单查询时
SELECT TOP 10 COALESCE(a.Name, 'NA') AS Name, 
              COUNT(DISTINCT a.Id) AS Result1, 
              COUNT(b.Id) AS Result2 
FROM Table1 a INNER JOIN Table2 b ON a.Id = b.Id 
GROUP BY a.Name

大约需要 20 分钟才能 return 结果。

有没有比使用 COUNT(DISTINCT) 更快地计算不同列的方法?

*我也试过用GROUP BY,但还是一样。

您可以尝试这样的操作:

select count(column_name) as n
from (select distinct column_name from yourTable) as a

这样,去重这个重量级的任务就简单的完成了SELECT

我当然假设您的专栏已编入索引。如果不是,我强烈建议您为其添加索引。

一个合理的数据库应该为您的查询利用 table(column_name) 上的索引。

在不了解您的 RDBMS 的情况下,无法肯定地说,但很可能不会,没有更好的方法。我猜想您需要在该列上创建一个索引,添加一个索引会将查询时间减少到几秒钟。

如果该列是外键列,您可以尝试 select 来自外键的计数 table 其中 ID 存在于较大的 table.

SELECT COUNT(Id) 
FROM   SmallTable
WHERE  Id IN (Select foreignKeyID from LargeTable)