Como responder por que de repente precisamos de índices ou de consultas precisam ser alteradas


11

Sou DBA júnior com 3 anos de experiência. Nosso trabalho é ajustar as consultas ou aconselhar os desenvolvedores que códigos específicos devem ser reescritos ou que índices são necessários.

Uma pergunta simples que a equipe de desenvolvimento faz com frequência é: "Ontem correu bem, o que mudou de repente?" e seremos solicitados a verificar o lado da infraestrutura. A primeira reação a qualquer problema parece sempre colocar a culpa máxima na infraestrutura, que é sempre a primeira coisa a ser validada.

Como devemos responder às perguntas "o que mudou" pela equipe de desenvolvimento? Vocês já enfrentaram a mesma situação? Nesse caso, compartilhe sua experiência.

Respostas:


10

Como responder o que mudou a pergunta pelo dev?

Essa é uma pergunta muito comum, não apenas no DEV, mas também em todas as equipes de TI e negócios.

O que mudou ? ==> pode ser respondido por fatos e números.

Os fatos se referem a, por exemplo

  • aumentar a quantidade de usuários que estão acessando o banco de dados?
  • Alguma alteração no parâmetro de configuração do servidor?
  • Manutenção do banco de dados - atualizar estatísticas, reorganizar / reconstruir os índices que não estão sendo executados? Devido a isso, os planos estão sendo gerados incorretamente!
  • A quantidade de dados aumentou?
  • Foram feitas alterações no lado da rede, o sistema operacional foi corrigido e / ou um novo service pack ou CU para servidor sql foi implantado - sem fazer um teste de regressão completo do ciclo de negócios do seu aplicativo ?
  • A SAN subjacente tornou-se subitamente lenta?

Os números podem ser obtidos se você tiver dados para mostrar. Por exemplo :

  • A linha de base do seu servidor é crítica durante essa situação. Isso aliviará o jogo da culpa, já que você pode apoiar os fatos com números sólidos.
  • Comece a coletar dados usando DMVs ou sp_whoisactive em uma tabela, para que os dados sejam mantidos após a reinicialização do servidor sql.

(você precisa se exercitar com base em seu ambiente e necessidades, com que frequência coletar os dados / quais dados coletar e quanto será o período de retenção) ou (pode investir em um software de terceiros, como o sqlsentry ou o gerente de diagnóstico da idera que fará o trabalho acima para você) .


7

Bem, você pode estar recebendo um plano diferente porque:

  • o plano pode ter sido despejado do cache devido a:
    • uma reinicialização do serviço
    • limpeza manual do cache do plano
    • uma reinicialização ou failover de serviço
    • uma alteração inadvertida, por exemplo, certas sp_configurealterações podem liberar o cache
    • algumas alterações nos objetos subjacentes, índices, estatísticas ou outras dependências acionaram uma recompilação
  • você pode estar apenas recebendo um plano diferente dos outros usuários ou invocações anteriores porque:
    • o texto da consulta pode não ser idêntico (isso inclui distinção entre maiúsculas e minúsculas , não importa colunas diferentes, critérios de associação, filtros etc.)
    • a consulta pode ser executada por usuários diferentes com opções de conjunto diferentes (ou esquemas padrão diferentes, se algum objeto do plano não tiver um nome completo, incluindo o esquema )
  • a consulta e o plano podem ser os mesmos, mas você pode ter um desempenho diferente porque:
    • o plano foi armazenado em cache usando parâmetros diferentes, e esse plano não é ideal para o conjunto atual de parâmetros (isso geralmente é chamado de "sniffing de parâmetros")
    • a quantidade de dados com base nos parâmetros ou simplesmente devido à alteração de dados nesse meio tempo é significativamente diferente
    • os dados foram alterados o suficiente para alterar a maneira mais eficiente de acessar os dados, mas não o suficiente para acionar atualizações ou recompilações de estatísticas (procure o problema principal crescente e o algoritmo de estatísticas automáticas)
    • os dados foram removidos do buffer pool e agora precisam ser lidos do disco
    • há simultaneidade, bloqueio ou outras pressões mais altas nos recursos necessários para satisfazer a consulta

Eu passo por muitos desses em mais detalhes aqui:

Se estes estão sendo executados em ambientes diferentes, tenho uma série de coisas para verificar aqui:

Além disso, é importante ter em mente que a criação de um índice ou a alteração da consulta pode não ser a razão direta de uma consulta ter um desempenho repentino - às vezes é apenas porque essas alterações realmente geraram um novo plano e / ou invalidaram o que já existia. .


7

Como sempre, Aaron Bertrand e Kin deram excelentes respostas. No entanto, ambas as respostas contêm um segmento comum. Se você analisar uma das respostas, verá que o motivo pelo qual o XYZ não está funcionando como funcionou ontem não é por causa de algo que você / eles / a pessoa X fez. A razão pela qual as coisas mudaram é porque o banco de dados decidiu fazer as coisas de maneira diferente devido a razões XYZ.

Um banco de dados é uma entidade viva e respiratória . Os bancos de dados tomarão decisões e mudarão de idéia devido a uma combinação de suposições, estatísticas e outras ferramentas heurísticas. Isso é drasticamente diferente da maioria da programação da camada de aplicativos (o aprendizado de máquina é uma exceção notável).

Vou usar algumas referências militares porque não consigo pensar em algo melhor agora. Uma metáfora mais geral seria apreciada (sem trocadilhos).

Na maioria das aplicações, o programador atua como um instrutor de perfuração. Eles dizem ao computador exatamente o que fazer, em que ordem e, às vezes, por quanto tempo. Programar um banco de dados é mais como atuar como Comandante. Você diz o que deseja fazer em um nível alto e oferece algumas orientações quando necessário. O banco de dados assume a tarefa de descobrir a melhor maneira de executar o plano com base na inteligência atual, como oficiais subalternos e não-comissionados.

Ao deixar essa distinção clara na mente de outros programadores, esperamos que eles comecem a ver que você não tem poderes ditatoriais, como eles têm sobre o ambiente. Você está guiando o banco de dados para a solução e, ocasionalmente, o banco de dados fica fora do caminho por boas ou más razões. Lembre-os de que, no final, não importa por que * o banco de dados saiu do rumo, mas o que podemos fazer para trazê-lo de volta.

* Reconheço que "o porquê" é muito valioso para prevenção futura, aprendizado etc., mas parece que o OP está enfrentando resistência de pessoas que não estão tentando aprender ou ajudar o problema.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.