gpt4 book ai didi

sql - 使用 DISTINCT COUNT 的性能

转载 作者:行者123 更新时间:2023-12-02 10:27:07 24 4
gpt4 key购买 nike

我正在运行 SQL Server 2012。

我有一个查询,当 strip 化到最基本的形式时,它看起来像这样:

SELECT COUNT(DISTINCT fullAddress) as quickCount 
FROM leads
WHERE yearID >=12 AND yearID <=21

leads 表中约有 1.49 亿条记录。 LeadID 上有一个聚集索引,还有一个非聚集索引,它是 YearID 上的索引,并且包含 fullAddress。

此查询运行大约需要 40 秒。我意识到这还不错,但在这种情况下还不够快。

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

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

SELECT COUNT(*) as quickCount 
FROM leads
WHERE yearID >=12 AND yearID <=21

运行仅需1秒。

不幸的是,我需要获取不同完整地址的计数。因此,我试图弄清楚是否可以采取任何措施来使第一个查询运行得更快。

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

enter image description here

这里有一个链接,可以查看更大的内容 - http://www.sequenzia.com/execPlan.jpg

据我所知,我的主要问题是不同排序 (52%)。

对此的任何帮助或反馈都会很棒。

谢谢!

更新

我采纳了 Thilo 的建议并应用了这个索引:

 CREATE INDEX IDX_X ON LEADS(FULLADDRESS, YEARID);

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

这对一些人有帮助,但我确实需要更多的性能。还有其他想法吗?

最佳答案

要尝试的一件事是通过在 fullAddress 上排序索引(还包括 yearID 列,以便您可以满足 where条款,太)。

CREATE INDEX IDX_X ON LEADS(FULLADDRESS, YEARID);

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

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

关于sql - 使用 DISTINCT COUNT 的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13924688/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com