我对一个缓慢的查询有问题。考虑一下表tblVotes --它有两列-- VoterGuid,CandidateGuid。它持有选民投票给任何数目的候选人。
这张表中有300多万行--约有13 000名不同的选民投票给大约270万名不同的候选人。该表中的行总数目前为650万行。
我的查询试图实现的是-在最快和最高速缓存-有效的方式(我们正在使用SQL )-根据他们获得的选票数前1000名候选人。
守则是:
SELECT CandidateGuid, COUNT(*) CountOfVotes
FROM dbo.tblVotes
GROUP BY CandidateGuid
HAVING COUNT(*) > 1
ORDER BY CountOfVotes DESC..。但是,当有一个非常满的表时,在上运行要花很长的时间。
有人能提出一个好的方法来加快速度并使它在快速的时间内运行吗?CandidateGuid是单独索引的--在CandidateGuid+VoterGuid上有一个复合主键。
发布于 2013-05-07 14:43:54
如果一个表中只有两个列,那么这两个字段上的“普通”索引不会对您有多大帮助,因为它实际上是整个表的副本,只是有序的。首先检查执行计划,如果您的索引正在使用。然后考虑将索引更改为聚集索引。
发布于 2013-05-07 15:00:58
尝试使用开头n,而不是词条,如下所示:
SELECT TOP 1000 CandidateGuid, COUNT(*) CountOfVotes
FROM dbo.tblVotes
GROUP BY CandidateGuid
ORDER BY CountOfVotes DESC发布于 2013-05-07 16:35:41
我不知道Server是否能够使用复合索引来加快查询的速度,但是如果它能够这样做,则需要将查询表示为SELECT CandidateGUID, COUNT(VoterGUID) FROM . . .才能得到优化。这是“安全的”,因为您知道VoterGUID从来不是空的,因为它是主键的一部分。
如果您的复合主键被指定为( CandidateGUID,VoterGUID),那么您将不会从单独的CandidateGUID索引中获得任何额外的好处--现有的索引可以用于优化单例索引将帮助进行的任何查询。
https://stackoverflow.com/questions/16421581
复制相似问题