繁体   English   中英

非常慢的SQL查询

[英]Very slow SQL query

我的查询速度很慢。 考虑表tblVotes-它有两列-VoterGuid,CandidateGuid 它拥有选民对任意数量候选人的投票。

此表中有超过300万行-大约有13,000个不同的选民对大约270万个不同的候选人进行投票。 该表中的总行数目前为650万。

我的查询试图实现的目标-以最快和最高效的缓存方式(我们正在使用SQL Express)-根据获得的票数获得前1000名候选人。

代码是:

SELECT CandidateGuid, COUNT(*) CountOfVotes
FROM dbo.tblVotes
GROUP BY CandidateGuid
HAVING COUNT(*) > 1
ORDER BY CountOfVotes DESC

...但是当表非常满时,这需要很长时间才能在SQL Express上运行。

有人可以建议一种加快此速度并使其快速运行的好方法吗? CandidateGuid分别编入索引-CandidateGuid + VoterGuid上有一个复合主键。

如果表中只有两列,那么这两个字段上的“普通”索引将无济于事,因为它实际上是整个表的副本,仅是有序的。 首先检查执行计划,是否完全使用了索引。 然后考虑将索引更改为聚集索引。

尝试使用前n个,而不使用hading子句-像这样:

SELECT TOP 1000 CandidateGuid, COUNT(*) CountOfVotes
FROM dbo.tblVotes
GROUP BY CandidateGuid
ORDER BY CountOfVotes DESC

我不知道SQL Server是否能够使用复合索引来加快此查询的速度,但是如果能够这样做,则需要将查询表示为SELECT CandidateGUID, COUNT(VoterGUID) FROM . . . SELECT CandidateGUID, COUNT(VoterGUID) FROM . . . 为了得到优化。 这是“安全的”,因为您知道VoterGUID绝不会为NULL,因为它是PRIMARY KEY的一部分。

如果您将复合主键指定为(CandidateGUID,VoterGUID),则仅CandidateGUID不会获得单独索引的任何其他好处-现有索引可用于优化单例索引将帮助的任何查询。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM