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
这有点帮助,但我真的需要更多的表现.还有其他想法吗?
可以尝试的一件事是通过排序索引fullAddress(也包括yearID列,以便您也可以满足 where 子句)来摆脱排序。
CREATE INDEX IDX_X ON LEADS(FULLADDRESS, YEARID);
Run Code Online (Sandbox Code Playgroud)
这样,您应该获得快速完整索引扫描(可能仍然比非重复计数的索引范围扫描慢,但希望比 40 秒排序更快)。
但为什么需要这么快呢?这不是你需要一直做的事情,对吧?我认为,如果这是针对公共网站的,那么您可以使用稍微过时的缓存结果。