L'environnement:
Nous avons deux machines Windows Server 2003 R2 32 bits exécutant SQL Server 2005. Les configurations matérielles sont des serveurs identiques avec un processeur Xeon 5160, 4 Go de RAM et 13 Go de RAID0. Les drapeaux AWE et / 3GB ne sont pas activés.
Les serveurs ont été configurés côte à côte à l'aide d'une liste de contrôle d'installation prédéfinie, et TOUS les logiciels installés sont les mêmes sur les deux machines.
Chaque paramètre d'installation de SQL Server et chaque niveau de correctif que nous savons vérifier sont identiques. Une différence est que TEMPDB est de 400 Mo sur la machine rapide et 1,2 Go sur la machine lente. Cependant, dans les deux cas, nous ne voyons aucune allocation TEMPDB en cours.
Le problème:
Il existe une procédure stockée qui s'exécute en 2 secondes sur l'un, mais 15 minutes sur l'autre. Pendant les 15 minutes supplémentaires, il y a peu ou pas d'activité sur le disque, aucun changement d'utilisation de la mémoire, mais un cœur de processeur est épinglé à 100% tout le temps.
Ce comportement persiste même lorsque les bases de données sont sauvegardées de l'une et restaurées sur l'autre.
Puisqu'il s'agit d'une procédure stockée, le moniteur d'activité et le profileur ne nous montrent aucun détail sur l' endroit où la procédure stockée se déroule.
La question:
Que devrions-nous regarder d'autre?
Suivre:
La lenteur se produit dans les instructions FETCH NEXT pour la définition de curseur suivante:
DECLARE C CURSOR FOR
SELECT X, Y
FROM dbo.A
WHERE X NOT IN (SELECT X FROM dbo.B)
AND Z <=0
...
<snip>
...
FETCH NEXT FROM C INTO @X, @Y
FETCH NEXT FROM C INTO @X, @Y
...
Chacune des instructions FETCH - sur une table contenant seulement environ 1000 lignes - nécessite environ 7,25 minutes. (Non, je ne sais pas pourquoi il en fait deux de suite, il faut demander aux développeurs, mais il fonctionne correctement sur les deux serveurs).
Je suis un peu méfiant de ce "PAS DANS (SÉLECTIONNER ...)", car il semble que les lectures virtuelles soient vraiment élevées.