O ambiente:
Temos duas máquinas Windows Server 2003 R2 de 32 bits executando o SQL Server 2005. As configurações de hardware são servidores idênticos com CPU Xeon 5160, 4 GB de RAM e 13 GB de RAID0. Os sinalizadores AWE e / 3GB não estão ativados.
Os servidores foram configurados lado a lado usando uma lista de verificação de instalação predefinida e TODOS os softwares instalados são os mesmos nas duas máquinas.
Cada configuração de instalação do servidor SQL e nível de patch que sabemos verificar são idênticos. Uma diferença é que o TEMPDB tem 400 MB na máquina rápida e 1,2 GB na máquina lenta. No entanto, em ambos os casos, não vemos nenhuma alocação de TEMPDB ocorrendo.
O problema:
Há um procedimento armazenado que é executado em 2 segundos em um, mas 15 minutos no outro. Durante os 15 minutos adicionais, há pouca ou nenhuma atividade no disco, nenhum uso de memória é alterado, mas um núcleo da CPU é fixado em 100% o tempo todo.
Esse comportamento persiste mesmo quando o backup dos bancos de dados é feito de um e restaurado no outro.
Como é um procedimento armazenado, o monitor de atividade e o criador de perfil não nos mostram detalhes sobre onde está ocorrendo essa atividade de alta CPU no procedimento armazenado.
A questão:
O que mais devemos olhar?
Acompanhamento:
A lentidão ocorre nas instruções FETCH NEXT para a seguinte definição 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 uma das instruções FETCH - em uma tabela contendo apenas cerca de 1000 linhas - requer cerca de 7,25 minutos. (Não, eu não sei por que ele faz dois seguidos, preciso perguntar aos desenvolvedores, mas ele é executado corretamente nos dois servidores).
Desconfio um pouco desse "NOT IN (SELECT ...)", pois parece que o Virtual Reads é realmente alto.