使用DISTINCT COUNT的性能

Seq*_*zia 10 sql t-sql sql-server indexing performance

我正在运行SQL Server 2012.

我有一个查询,当条纹到它时,最基本的形式如下所示:

SELECT COUNT(DISTINCT fullAddress) as quickCount 
FROM leads
WHERE yearID >=12 AND yearID <=21
Run Code Online (Sandbox Code Playgroud)

潜在客户表中有大约1.49亿条记录.leadID上有一个聚簇索引,一个非聚集索引是YearID上的索引,并且包含fullAddress.

这个查询大约需要40秒才能运行.我意识到这并不错,但在这种情况下还不够快.

我查看了执行计划,据我所知,60%的成本是DISTINCT COUNT.

当我在没有DISTINCT COUNT的情况下运行相同的查询时,如下所示:

SELECT COUNT(*) as quickCount 
FROM leads
WHERE yearID >=12 AND yearID <=21
Run Code Online (Sandbox Code Playgroud)

运行只需1秒.

不幸的是,我需要计算不同的完整地址.所以我试图找出是否有什么可以让第一个查询运行得更快.

以下是两个查询的执行计划的屏幕截图:

在此输入图像描述

这是一个更大的链接 - http://www.sequenzia.com/execPlan.jpg

据我所知,我的主要问题是Distinct Sort(52%).

任何有关这方面的帮助或反馈都会很棒.

谢谢!

UPDATE

我接受了Thilo的建议并应用了这个索引:

 CREATE INDEX IDX_X ON LEADS(FULLADDRESS, YEARID);
Run Code Online (Sandbox Code Playgroud)

实际上,我创建了两个新的测试表,每个测试表都有相同的1百万条记录.我将同样的原始索引应用于两者,然后将上述索引应用于一个.现在,当我比较同一执行计划中的2个表时,具有上述指数的表略好于48%到52%.这是新的执行计划 - http://www.sequenzia.com/execPlan2.jpg

这有点帮助,但我真的需要更多的表现.还有其他想法吗?

Thi*_*ilo 4

可以尝试的一件事是通过排序索引fullAddress(也包括yearID列,以便您也可以满足 where 子句)来摆脱排序。

CREATE INDEX IDX_X ON LEADS(FULLADDRESS, YEARID);
Run Code Online (Sandbox Code Playgroud)

这样,您应该获得快速完整索引扫描(可能仍然比非重复计数的索引范围扫描慢,但希望比 40 秒排序更快)。

但为什么需要这么快呢?这不是你需要一直做的事情,对吧?我认为,如果这是针对公共网站的,那么您可以使用稍微过时的缓存结果。