替代COUNT(DISTINCT column_name)以检索数百万个数据

时间:2015-06-11 20:28:18

标签: sql count sql-server-2008-r2 distinct

我有一个存储超过1000万个数据的表,当我使用简单查询时,例如

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分钟。

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

*我也尝试使用GROUP BY,但它也一样。

4 个答案:

答案 0 :(得分:2)

如果列是外键列,您可以尝试从较大表中存在ID的外键表中选择计数。

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

答案 1 :(得分:0)

您可以尝试这样的事情:

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

这样,重复数据删除的繁重任务是通过简单的SELECT完成的。

我当然假设您的列已编入索引。如果不是,我强烈建议你添加一个索引。

答案 2 :(得分:0)

合理的数据库应该利用{{1}}上的索引来查询。

答案 3 :(得分:0)

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