L'ambiente:
Abbiamo due macchine Windows Server 2003 R2 a 32 bit che eseguono SQL Server 2005. Le configurazioni hardware sono server identici con CPU Xeon 5160, 4 GB di RAM e 13 GB di RAID0. I flag AWE e / 3GB non sono abilitati.
I server sono stati configurati parallelamente utilizzando un elenco di controllo di installazione predefinito e TUTTO il software installato è uguale su entrambi i computer.
Ogni impostazione di installazione del server SQL e livello di patch che sappiamo verificare sono identici. Una differenza è che TEMPDB è 400 MB sulla macchina veloce e 1,2 GB sulla macchina lenta. Tuttavia, in entrambi i casi, non vediamo alcuna allocazione TEMPDB in corso.
Il problema:
Esiste una procedura memorizzata che viene eseguita in 2 secondi su uno, ma 15 minuti sull'altro. Durante i 15 minuti aggiuntivi, l'attività del disco è scarsa o assente, non cambia l'utilizzo della memoria, ma un core della CPU è bloccato al 100% per tutto il tempo.
Questo comportamento persiste anche quando viene eseguito il backup dei database da uno e ripristinato all'altro.
Poiché si tratta di una procedura memorizzata, il monitor delle attività e il profiler non ci mostrano alcun dettaglio su dove si stia svolgendo questa attività della CPU nella procedura memorizzata.
La domanda:
Cos'altro dovremmo guardare?
Azione supplementare:
La lentezza si verifica nelle istruzioni FETCH NEXT per la seguente definizione del cursore:
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
...
Ciascuna delle istruzioni FETCH - su una tabella contenente solo circa 1000 righe - richiede circa 7,25 minuti. (No, non so perché fa due di fila, è necessario chiedere agli sviluppatori, ma funziona correttamente su entrambi i server).
Sono un po 'sospettoso di questo "NON IN (SELEZIONA ...)", poiché sembra che le letture virtuali siano davvero alte.