Uma dica de como encontrar possíveis gargalos e processos com problemas no SQL Server, está em utilizarmos a tabela de sistema sysprocesses como um dos exemplos abaixo:
select * from master..sysprocesses where status = ‘runnable’
ou
select * from master..sysprocesses where dbid = xx (Este serve para quando você já suspeita de um banco em questão)
Para saber o dbid de um banco execute: select DB_ID(‘nome do banco’) ou então execute diretamente a query passando o nome do banco como parâmetro:
select * from master..sysprocesses where dbid = db_id(‘Pubs’)
No retorno dessa query você terá o status de cada processo no SQL Server:
spid | kpid | blocked | waittype | waittime | lastwaittype | waitresource | dbid | uid | …
Verifique se existe algum tempo em que um processo está em espera. O waittime e waittype lhe dizem muito a respeito disso.
A coluna lastwaittype também é muito útil, segue um link com cada tipo de waittype e lastwaittype http://support.microsoft.com/kb/822101/
Identificando o tipo de espera, você consegue identificar o que está acontecendo, se é I/O, LATCH, MEMORY e etc.
Em último sugiro o uso do DBCC SQLPERF(threads). Este comando te dá o status de cada thread aberta pelo SQL Server, bem como cada processo associado a esta thread. Te retorna informações de status, IO, CPU e MEM.
A princípio pode parecer algo nebuloso, porém a maioria dos problemas se resolve olhando direto no sysprocesses. Essa técnica em conjunto com ferramentas do tipo SQL Profiler, Perfmon do Windows, torna-se algo muito útil para identificar problemas de performance e outros.
Em breve pretendo postar outros artigos sobre como identificar gargalos e encontrar problemas no SQL Server 2000 e 2005.
Até a próxima !
_________________
Abraços,
Rodrigo Fernandes

