Em quem confiar?

8

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.

Rick
fonte
15
A fragmentação da extensão não fará com que as consultas congelem e parem de funcionar. Você precisa dizer ao fornecedor para evitar a confusão e ajudá-lo a analisar o que realmente está acontecendo no SQL Server quando esse problema está ocorrendo - verifique se há bloqueios, verifique as estatísticas de espera etc. na banana que eu almocei ontem.
Aaron Bertrand
A primeira pergunta que eu teria é quais são as esperas que você está vendo quando o problema está ocorrendo. Suponho que este seja um problema (com base na sua pergunta) com todas as consultas em execução no ambiente. Vimos isso com alguns clientes durante a execução de cargas de trabalho em máquinas com grande quantidade de RAM e CPUs (> 16 GB,> 16CPUs). Estaria interessado na configuração de hardware que você está executando, as esperas que você está vendo e a versão SQL Server
Amit Banerjee
11
Posso recomendar ouvir pluralsight.com/courses/sqlserver-supporting-isv-applications e também tentar executar o sp_blitz de Brent Ozar para ver uma lista de recomendações que você pode adicionar ao sistema sem interromper as coisas?
Henrik Staun Poulsen
A resposta simples ao fornecedor para impedi-los de ficar obcecados com a fragmentação e realmente começar a diagnosticar é: "A fragmentação está presente constantemente. Se essa foi a causa raiz desse problema, isso aconteceria o dia todo também. Como obviamente não está acontecendo o dia todo, não pode ser o problema, pode? ".
Sir Swears-

Respostas:

1

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. ... Em particular, eles estão dizendo que nossos índices são um problema.

Ah, certo, acho que já ouvi essa piada antes. Não é algo como:

Um pato entra em um bar e diz: "Ai!" (brincando ;-) e o barman diz: "O que você tem?"

O pato diz: "Me dê três dedos da sua vodka mais forte".

O barman diz, quase como se estivesse brincando: "Você não quer dizer 3 'penas'?"

O pato diz: "Olha, me desculpe, você não é mais o escritor principal de Everybody Loves Raymond , mas está sendo um dia difícil, então você pode ser um amigo e se divertir com a vodka?"

O barman diz: "Claro, amigo. Espere".

Ele volta um momento depois, visivelmente um pouco menos feliz do que quando saiu e diz ao pato: "Parece que estamos todos fora das coisas boas. Tudo o que nos resta é Skyy. Isso funcionará?"

O pato pula no balcão, pega o barman pelo colarinho com uma asa (de alguma forma), puxa uma faca de, bem, em algum lugar com a outra asa e diz, bem devagar, suavemente, mas claramente: "Eu. Você corta.

O barman, em pânico, diz: "Ei, cara, é o banco de dados. É lento. Não está respondendo".

O pato, um pouco confuso sobre se ele deveria ou não terminar o barman - aqui e agora - late para ele com raiva: "O banco de dados? Do que diabos você está falando?"

O barman, agora chorando, deixa escapar: "Eu não sei ... Existe algum bloqueio acontecendo? .. É exatamente o que dizemos ... Você pode tentar reconstruir índices ou algo assim? .. você sabe, quando não sabemos mais o que dizer .... talvez devêssemos adicionar mais memória ao servidor ... você acha que isso ajudaria? ... todo mundo sabe que o código do aplicativo é rápido e os bancos de dados são o gargalo da garrafa .. ..Ei, eu tenho ouvido falar sobre esses bancos de dados NoSQL que são <air-quotes> em escala da web </air-quotes> e geralmente são de código aberto, então são gratuitos e, como Twitter, Google e O Facebook usa essas coisas, já que os bancos de dados relacionais estão praticamente saindo. "

E com isso, o pato havia se decidido ...........

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 um SqlConnectionobjeto. 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:

SELECT sdec.*, '---' AS [---], sdes.*
FROM sys.dm_exec_connections sdec
INNER JOIN sys.dm_exec_sessions sdes
        ON sdes.session_id = sdec.session_id

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 ;-).

Solomon Rutzky
fonte
-1

Uma coisa que você pode revisar para ver se seus índices precisam ser reorganizados ou reconstruídos é usar esta consulta:

declare @strBD nvarchar(50)

set @strBD = N'Tu_BD';

select table = OBJECT_NAME(object_id, database_id)
    ,index = index_id
    ,Index_Type = index_type_desc
    ,Logic_Frag = avg_fragmentation_in_percent
    ,Action = case 
        when avg_fragmentation_in_percent < 30.0
            then 'ALTER INDEX REORGANIZE'
        else 'ALTER INDEX REBUILD WITH (ONLINE = ON)'
        end
from sys.dm_db_index_physical_stats(DB_ID(@strBD), null, null, null, 'LIMITED');

Substitua @strBDpor your 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.

Guillermo Taylor
fonte
identifying some queries and execution plans with a SQL Profiler capture.oh .. por favor .. não capture exec planscom o Profiler. Ele pode deixar seu servidor de joelhos. Em vez disso, procure dados DMV.
Kin Shah