Chaves estrangeiras não indexadas podem tornar o desempenho pior.

Chaves estrangeiras não indexadas podem tornar o desempenho pior.

cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br


Eu sei. Você, caro leitor, viu aquele título e veio aqui porque está furioso. Você deseja que os relacionamentos de chave estrangeira sejam configurados em todas as suas tabelas para evitar a entrada de dados inválidos.

Mas você precisa ter certeza de indexá-los também.

Vamos pegar o banco de dados Stack Overflow – estou usando a versão Stack Overflow 2013 de 50 GB para este post. Vou começar sem nenhum índice não clusterizado e, em seguida, vou adicionar chaves estrangeiras entre a tabela Usuários e várias tabelas onde os usuários adicionam conteúdo, como Emblemas, Comentários, Postagens e Votos:

Leia Também  Como controlar o desempenho de consultas que usam dicas RECOMPILE

Agora, digamos que meu aplicativo deseja excluir um usuário específico, id # 26837. Primeiro, o aplicativo começa excluindo todas as linhas nas tabelas de conteúdo para este usuário:

Isso faz varreduras de tabela e, por algum motivo, estamos de acordo com isso porque nosso aplicativo raramente faz exclusões. Agora que todas as tabelas de conteúdo foram eliminadas, vamos voltar e excluir a linha do usuário:

É apenas deletar uma linha, certo? Quão ruim pode ser?

Chaves estrangeiras não indexadas podem tornar o desempenho pior. 2

Terrível, ao que parece. O SQL Server deseja verificar novamente todas as tabelas de conteúdo para certificar-se de que o Usuário 26837 não possui emblemas, comentários, publicações ou exibições. Também fazemos muitas leituras lógicas:

Chaves estrangeiras não indexadas podem tornar o desempenho pior. 3

A primeira solução em que você provavelmente pensa: indexe todas as colunas de chave estrangeira:

Isso faz com que as exclusões vão maneira mais rápido, mas tem alguns custos: inserções e atualizações mais lentas para manter esses índices, um tamanho de banco de dados 3% maior neste caso, trabalhos de manutenção 3% mais longos, etc.

Em um compromisso recente, simplesmente não podíamos usar essa solução. Eles já tinham sérios problemas de desempenho durante as inserções: seu hardware não conseguia lidar com nenhuma lentidão adicional durante as inserções e atualizações, e eles já tinham muitos problemas de bloqueio e gravação. Outras opções de solução incluídas:

  • Enfileirando as exclusões para mais tarde – neste exemplo de Stack Overflow, digamos que o aplicativo não exclui diretamente as linhas de usuários e, em vez disso, adiciona linhas a uma tabela de fila para serem manipuladas posteriormente. Durante uma janela de manutenção, poderíamos fazer as exclusões em lotes, descartando grupos de usuários nas tabelas com apenas uma passagem.
  • Elimine as chaves estrangeiras – neste cliente em particular, as chaves foram configuradas com NOCHECK de qualquer maneira devido a dados incorretos do passado, e não havia uma maneira de consertar isso rápido o suficiente. Nesse caso, descartar as chaves estrangeiras tornava as exclusões instantaneamente mais rápidas, o que era parte da solução geral para obter alívio da dor suficiente para passar pela temporada agitada.

Eu gostaria que cada banco de dados tivesse dados perfeitos, chaves estrangeiras perfeitas, índices perfeitos e hardware perfeito para sustentar toda a carga? Absolutamente. Mas na vida real, as restrições não são preto e branco: são cinquenta tons de … ah, você sabe.

cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br