2010-09-21 3 views
17

Comment est-ce que je peux comparer deux requêtes X et Y et dire que X est meilleur que Y, quand ils prennent tous les deux presque la même heure dans de petits scénarios? Le problème est que j'ai deux requêtes qui sont supposées s'exécuter sur une très grande base de données, donc exécuter et évaluer n'est pas tout à fait une option. Par conséquent, nous avons créé une petite base de données pour effectuer quelques tests. Évaluer quelle requête est la meilleure est un problème, car sur notre base de test, ils fonctionnent presque en même temps (environ 5 minutes). En plus du temps nécessaire au retour, quelle autre façon de mesurer la qualité d'une requête?Comment comparer deux requêtes?

+0

Salut, je mets juste cela en question MSSQL – User7354632781

Répondre

26
SET STATISTICS IO ON 
SET STATISTICS TIME ON 

Exécutez les requêtes et comparez les lectures logiques pour les différentes tables et les heures d'exécution.

+8

@CombatCaptain Vous pouvez également empiler les requêtes de comparaison ensemble dans SSMS et appuyez sur 'CTRL + M' (inclure le plan d'exécution réel), puis' F5'. Passez ensuite le curseur sur le premier nœud dans l'onglet «Plan d'exécution réel» et lisez le «Coût estimé du sous-arbre». –

+2

Ces instructions ne semblent généralement pas prises en charge. ERREUR [15001] Une erreur de syntaxe s'est produite au niveau ou avant: SET STATISTICS IO ON – dokaspar

2

Avez-vous examiné les plans de requête? Si les requêtes renvoient les mêmes données et prennent le même temps d'exécution, je suppose que les plans de requête seront presque identiques, ce qui signifie qu'il n'y a pas de différence significative entre les deux requêtes.

De même, avez-vous pris en compte le fait que les requêtes s'exécutent différemment lorsque la taille de la base de données change? Je me demande si vous optimisez prématurément le code. Dans mon esprit, si j'ai une requête qui fonctionne et est compréhensible, je peux résoudre les problèmes de performance à travers les index. Et c'est généralement plus facile que de changer les requêtes pour améliorer les performances.

3

Comme déjà mentionné, vérifiez les plans d'exécution. Surtout, comparez les 2 requêtes équitablement en effaçant le cache entre chaque exécution, juste pour vous assurer que vous ne voyez pas de résultats biaisés en raison de l'effet des données déjà en cache (ne pas exécuter sur le serveur de production):

DBCC DROPCLEANBUFFERS -- clear proc plan cache 
DBCC FREEPROCCACHE -- clear data cache 

Ensuite, ce que je fais habituellement est de vérifier les lectures, écritures, CPU et durée pour une comparaison.

Il est très important que vous testiez avec des volumes de données au niveau de la production (et idéalement plus grand pour voir comment il évoluera). C'est à ces volumes que vous verrez vraiment toute différence de performance. Les tests avec de petits volumes de données peuvent vous poser des problèmes plus tard.

0

L'évaluation des performances de requête sur un ensemble de données significativement différent n'a généralement pas beaucoup de sens. Les plans de requête et leur efficacité peuvent varier considérablement en fonction des statistiques de données. Donc, pour obtenir des estimations réalistes, vous avez besoin d'une base de données aussi proche que possible de la "vraie" base de données. Le meilleur de tous, prenez une copie de votre "grande base de données" et ajustez vos requêtes.