2

我遇到了慢查询的问题。考虑表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 上有一个复合主键。

4

3 回答 3

1

如果表中只有两列,那么这两个字段上的“正常”索引对您没有多大帮助,因为它实际上是整个表的副本,只是有序的。首先检查执行计划,如果您的索引正在被使用。然后考虑将索引更改为聚集索引。

于 2013-05-07T14:43:54.667 回答
0

I don't know if SQL Server is able to use the composite index to speed this query, but if it is able to do so you would need to express the query as SELECT CandidateGUID, COUNT(VoterGUID) FROM . . . in order to get the optimization. This is "safe" because you know VoterGUID is never NULL, since it's part of a PRIMARY KEY.

If your composite primary key is specified as (CandidateGUID, VoterGUID) you will not get any added benefit of a separate index on just CandidateGUID -- the existing index can be used to optimize any query that the singleton index would assist in.

于 2013-05-07T16:35:41.630 回答
0

尝试使用 top n,而不是 having 子句 - 像这样:

SELECT TOP 1000 CandidateGuid, COUNT(*) CountOfVotes
FROM dbo.tblVotes
GROUP BY CandidateGuid
ORDER BY CountOfVotes DESC
于 2013-05-07T15:00:58.673 回答