Estamos solucionando um problema de longa duração com um fornecedor. Seu software tende a congelar e parar de funcionar uma ou duas vezes por semana, causando grandes interrupções em nossa operação. Eles não conseguiram determinar a causa, apesar de enviarmos muitos GBs de logs e backups do banco de dados. Ultimamente, eles começaram a sugerir que os problemas estão relacionados à nossa manutenção e talvez não ao seu software (apesar de não haver consultas demoradas, pressão na CPU / RAM / IO ou até mesmo conflitos quando os problemas ocorrem). Em particular, eles estão dizendo que nossos índices são um problema.
Sua ferramenta favorita a ser usada é o showcontig do DBCC, apesar de eu argumentar que a coisa foi preterida pelo MS. Eles ficam obcecados com a densidade da varredura e a extensão da fragmentação, principalmente. Para tirar a desculpa, instituí uma manutenção noturna agressiva que reconstrói índices com <90% de densidade de varredura ou> 10% de fragmentação. Isso os tirou do trem de densidade de varredura, mas eles permanecem fixos na fragmentação da extensão. O showcontig do DBCC mostra uma fragmentação de alta extensão, mesmo em um índice que foi reconstruído horas antes. Abaixo estão os resultados de dbcc_showcontig e sys.dm_db_index_physical_stats para uma tabela que eles apontaram como um "possível problema".
DBCC SHOWCONTIG
- Páginas digitalizadas ................................: 1222108
- Extensões verificadas ..............................: 152964
- Chaves de extensão ..............................: 180904
- Média Páginas por extensão ........................: 8.0
- Densidade de digitalização [Melhor contagem: contagem real] .......: 84,44% [152764: 180905]
- Fragmentação de Varredura Lógica ..................: 3,24%
- Fragmentação de Varredura Extendida ...................: 35.97%
- Média Bytes Grátis por Página .....................: 692.5
- Média Densidade da página (completa) .....................: 91.44%
sys.dm_db_index_physical_stats
index_type_desc alloc_unit_type_desc Avg_fragmentation_in_percent page_count
CLUSTERED INDEX IN_ROW_DATA 3.236803129 1222070
NONCLUSTERED INDEX IN_ROW_DATA 0.680074642 48230
NONCLUSTERED INDEX IN_ROW_DATA 0.093237195 48264
NONCLUSTERED INDEX IN_ROW_DATA 0.03315856 48253
NONCLUSTERED INDEX IN_ROW_DATA 0.194653248 48291
NONCLUSTERED INDEX IN_ROW_DATA 0.393480436 58961
NONCLUSTERED INDEX IN_ROW_DATA 0.23622292 64346
NONCLUSTERED INDEX IN_ROW_DATA 0.041445623 48256
NONCLUSTERED INDEX IN_ROW_DATA 0.701172007 59044
NONCLUSTERED INDEX IN_ROW_DATA 0.216397724 53605
Devo me preocupar com meus índices? O acima não é atípico. O MS DMV preferido parece mostrar que está bem, mas o fornecedor está preso nessa fragmentação de 35,97%. Eu suspeito que é só eles tentando desesperadamente encontrar algo para culpar seus problemas de software, mas se eu tiver um problema real, quero tentar corrigi-lo.
fonte
Respostas:
Ah, certo, acho que já ouvi essa piada antes. Não é algo como:
Hmm. Bem, confie em mim, é muito mais engraçado no húngaro original.
Mas, ainda assim, por que a reação inicial de tantas pessoas, quando um sistema fica lento, apenas assumindo que é o banco de dados? Como se o código do aplicativo não pudesse ser horrivelmente escrito, ou simplesmente tivesse alguns bugs? As coisas que estão ficando mais lentas certamente podem ser o banco de dados. Mas simplesmente trancar / congelar? Isso não me parece um problema específico do banco de dados.
O que ele faz som como é, possivelmente, algum código aplicativo que não está liberando corretamente os recursos externos (sockets de rede, cabos de sistema de arquivos, etc). Se estamos falando de um aplicativo .NET, às vezes os desenvolvedores esquecem adequadamente
Dispose()
dos objetos que associaram recursos não gerenciados. Por exemplo: abrindo umSqlConnection
objeto. Você não recebe uma quantidade infinita deles. Então, se eles querem procurar no banco de dados, tudo bem. Mas talvez, na próxima vez que o sistema congele, dê uma olhada rápida em:Se o código deles não estiver liberando as conexões, deve ser bastante óbvio se houver muitas conexões, especialmente se muitas delas tiverem longos períodos de inatividade.
E talvez esse material já tenha sido verificado e simplesmente não divulgado na Questão. Mas me parece bastante estranho que eles estejam tão focados em índices e fragmentação. Claro, existem problemas de detecção de parâmetros que às vezes levam um ou alguns procedimentos armazenados a demorar MUITO LONG tempo, mas bloqueando um aplicativo inteiro? Não estou comprando, especialmente se você não vir uma consulta em execução e consumir muitos recursos ou bloqueios ou quando isso acontecer.
Então, "em que confiar?" Certamente não este fornecedor ;-).
fonte
Uma coisa que você pode revisar para ver se seus índices precisam ser reorganizados ou reconstruídos é usar esta consulta:
Substitua
@strBD
poryour database name
.De acordo com os resultados, proceda conforme indicado em https://msdn.microsoft.com/en-us/library/ms189858(v=sql.110).aspx . Este link é para a versão 2012 do SQL Server; selecione a versão correta para prosseguir corretamente.
Como alguém comentou, é melhor informar o seu fornecedor que analisa e corrige, além do "problema de fragmentação". Talvez identificando algumas consultas e planos de execução com uma captura do SQL Profiler.
fonte
identifying some queries and execution plans with a SQL Profiler capture.
oh .. por favor .. não captureexec plans
com o Profiler. Ele pode deixar seu servidor de joelhos. Em vez disso, procure dados DMV.