El entorno:
Tenemos dos máquinas Windows Server 2003 R2 de 32 bits que ejecutan SQL Server 2005. Las configuraciones de hardware son servidores idénticos con CPU Xeon 5160, 4 GB de RAM y 13 GB de RAID0. Las banderas AWE y / 3GB no están habilitadas.
Los servidores se configuraron uno al lado del otro utilizando una lista de verificación de instalación predefinida, y TODO el software instalado es el mismo en ambas máquinas.
Cada configuración de instalación del servidor SQL y nivel de parche que sabemos verificar son idénticos. Una diferencia es que TEMPDB es de 400 MB en la máquina rápida y de 1,2 GB en la máquina lenta. Sin embargo, en ambos casos, no vemos ninguna asignación TEMPDB.
El problema:
Hay un procedimiento almacenado que se ejecuta en 2 segundos en uno, pero 15 minutos en el otro. Durante los 15 minutos adicionales, hay poca o ninguna actividad en el disco, no hay cambios en el uso de la memoria, pero un núcleo de CPU se fija al 100% todo el tiempo.
Este comportamiento persiste incluso cuando las bases de datos se respaldan de una y se restauran a la otra.
Dado que se trata de un procedimiento almacenado, el monitor de actividad y el generador de perfiles no nos muestran ningún detalle sobre en qué parte del procedimiento almacenado está teniendo lugar esta alta actividad de la CPU.
La pregunta:
¿Qué más deberíamos estar mirando?
Seguimiento:
La lentitud ocurre en las instrucciones FETCH NEXT para la siguiente definición de cursor:
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
...
Cada una de las declaraciones FETCH, en una tabla que contiene solo alrededor de 1000 filas, requiere aproximadamente 7.25 minutos. (No, no sé por qué hace dos seguidas, necesito preguntar a los desarrolladores, pero se ejecuta correctamente en ambos servidores).
Sospecho un poco de que "NO ES (SELECCIONE ...)", ya que parece que las lecturas virtuales son realmente altas.