用于检索数百万数据的 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)
我有一个存储超过 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)