Requête SQL très lente

J'ai un problème avec une requête lente. Considérez la table tblVotes – et il a deux colonnes – VoterGuid, CandidateGuid . Il détient les suffrages exprimés par les électeurs à un nombre quelconque de candidats.

Il y a plus de 3 millions de lignes dans ce tableau – avec environ 13 000 électeurs distincts qui votent à environ 2,7 millions de candidats distincts. Le nombre total de lignes dans le tableau est actuellement de 6,5 millions.

Ce que tente d'get ma requête, c'est – de la manière la plus rapide et efficace possible (nous utilisons SQL Express) – les 1000 meilleurs candidats en fonction du nombre de votes qu'ils ont reçus.

Le code est:

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

… mais cela prend un time effrayant pour s'exécuter sur SQL Express quand il y a une table très complète.

Quelqu'un peut-il suggérer un bon moyen d'accélérer cela et de le faire fonctionner rapidement? CandidateGuid est indexé individuellement – et il existe une key primaire composite sur CandidateGuid + VoterGuid.

Si vous avez seulement deux colonnes dans une table, un index "normal" sur ces deux champs ne vous aidera pas beaucoup, parce que c'est en fait une copy de votre table entière, seulement commandée. Commencez par vérifier le plan d'exécution, si votre index est utilisé. Ensuite, envisagez de modifier votre index en index clusterisé.

Essayez d'utiliser un top n, au lieu d'une clause having – comme ceci:

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

Je ne sais pas si SQL Server est capable d'utiliser l'index composite pour accélérer cette requête, mais s'il est capable de le faire, vous devez exprimer la requête en tant que SELECT CandidateGUID, COUNT(VoterGUID) FROM . . . SELECT CandidateGUID, COUNT(VoterGUID) FROM . . . afin d'get l'optimization. Ceci est "sûr" car vous savez que VoterGUID n'est jamais NULL, car il fait partie d'une key PRIMARY.

Si votre key primaire composite est spécifiée en tant que (CandidateGUID, VoterGUID), vous n'obtiendrez aucun avantage supplémentaire d'un index séparé sur CandidateGUID uniquement – l'index existant peut être utilisé pour optimiser toute requête à laquelle l'index singleton pourrait participer.