Em um servidor SQL de produção, vejo picos enormes e intermitentes no tráfego de dados. Até 200Mbit/s que está causando esperas de NETWORK IO que, por sua vez, causam tempos limite de consulta. Como posso descobrir quais consultas estão retornando grandes conjuntos de resultados?
relate perguntas
-
SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado
-
Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?
-
Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?
-
Quais são as principais causas de deadlocks e podem ser evitadas?
-
Como determinar se um Índice é necessário ou necessário
Você pode encontrar isso no DMV s:
Ao contrário do rastreamento, isso deve ser perfeitamente seguro para ser executado em um servidor de produção.
Eu rastrearia os dados de produção usando o SQL Profiler e reuniria os códigos/lotes com as maiores leituras e gravações. Filtre o rastreamento para obter apenas procedimentos e lotes com alto número de leituras/gravações. Escolha uma amostra que se encaixe no seu olho: digamos mais de 1 milhão de leituras ou gravações.
Eu pegaria uma amostra dessas chamadas para uma máquina de desenvolvimento/teste e as executaria no Management Studio com a opção 'Incluir estatísticas do cliente' habilitada (no menu Consulta - Incluir estatísticas do cliente). Em seguida, você terá uma janela separada com informações de estatísticas do cliente: Bytes enviados do cliente, Bytes recebidos do servidor.
NÃO HABILITE O RASTREIO EM UM BD DE PRODUÇÃO SEM FILTRAR OS DADOS!!! Filtre o máximo possível (por db, nome do host, o que você acreditar) e só então inicie o rastreamento. Não se esqueça de fechar o Profiler após :-).
PS: Lembrei de outra opção legal: ao longo do trace por um período, você também deve salvar os dados usando o Perfmon (escolher apenas IO params). O Profiler tem um bom recurso de importar juntos um arquivo de rastreamento e um arquivo de dados perfmon. E você pode ver lá quando tiver os maiores picos de IO.
PS2: Concordo que a opção do Caio é mais elegante. Mas deixo minha volumosa resposta para a posteridade! :-)
Se você ainda não deu uma olhada, talvez queira dar uma olhada no sp_WhoIsActive de Adam Machanic. Recentemente, ele fez uma série de postagens de blog explicando diferentes recursos incorporados ao sp_WhoIsActive, um dos quais é @delta_interval.
Isso não apenas mostrará o que está ocupando mais CPU ou E/S em geral, mas também pode mostrar o que está ocupando mais CPU ou E/S no momento.
Confira a seguinte série de blogs para obter uma explicação completa sobre esse recurso:
http://whoisactive.com/docs/01_background/
A postagem de blog a seguir explica como classificar a saída de sp_WhoIsActive e selecionar quais colunas exibir:
http://whoisactive.com/docs/24_output/
Esta é uma das muitas postagens disponíveis no seguinte link de atualizações que ele configurou.
http://whoisactive.com
A versão 11.0 está disponível no momento desta resposta, portanto, se você estiver usando uma versão mais antiga, talvez seja hora de atualizar: D