我遇到了查询速度慢的问题。考虑表 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上有一个复合主键。
答案 0 :(得分:0)
如果表中只有两列,那么这两个字段上的“普通”索引对您没什么帮助,因为它实际上是整个表的副本,只是有序。首先检查执行计划,如果您的索引正在使用。 然后考虑将索引更改为聚簇索引。
答案 1 :(得分:0)
尝试使用top n而不是having子句 - 如下所示:
SELECT TOP 1000 CandidateGuid, COUNT(*) CountOfVotes
FROM dbo.tblVotes
GROUP BY CandidateGuid
ORDER BY CountOfVotes DESC
答案 2 :(得分:0)
我不知道SQL Server是否能够使用复合索引来加速此查询,但如果能够这样做,则需要将查询表达为SELECT CandidateGUID, COUNT(VoterGUID) FROM . . .
才能获得优化。这是“安全的”,因为你知道VoterGUID永远不会为NULL,因为它是PRIMARY KEY的一部分。
如果您的复合主键被指定为(CandidateGUID,VoterGUID),那么您将无法在CandidateGUID上获得单独索引的任何额外好处 - 现有索引可用于优化单例索引将协助的任何查询。