É ruim ter espaço de índice maior que espaço de dados?

22

Muitas vezes, preciso executar consultas em tabelas grandes que não têm o índice correto. Então, peço ao DBA para criar esse índice. A primeira coisa que ele faz é olhar para as estatísticas da tabela e ver o tamanho do espaço do índice.

Muitas vezes, ele me dizia para encontrar uma solução alternativa porque "o índice já é maior que a tabela". Ele acha que o índice precisa ser menor que os dados, porque, ele me disse: "você já viu o índice em um livro? É muito menor que o próprio livro, e é assim que um índice de tabela deve ser".

Não acho que a filosofia dele esteja correta, mas não posso desafiá-lo porque ele é um DBA líder e sou desenvolvedor. Sinto que, se uma consulta precisar de um índice, o índice deve ser criado, em vez de encontrar "soluções alternativas" que apenas tornem os SPs ilegíveis e não-mantidos.

Estou selecionando apenas as colunas necessárias. O problema é que estou filtrando por data, para que o mecanismo faça necessariamente uma varredura de tabela para corresponder às colunas. A consulta é executada uma vez por dia, à noite, para coletar estatísticas, mas leva 15 minutos para ser executada (temos outra regra rígida e rápida: nenhum procedimento deve levar mais de 3 minutos).

O DBA me mostrou as estatísticas do índice. Havia cerca de 10 índices nessa tabela, dos quais apenas 6 foram usados ​​(as estatísticas mostraram zero ocorrências em 4 delas). Este é um sistema grande com a participação de mais de 20 desenvolvedores. Os índices foram criados por qualquer motivo e provavelmente não são mais usados.

Somos obrigados a oferecer suporte ao SQL Server 2008, pois é nisso que os bancos de dados de teste são executados. Mas os clientes são todos em 2014 e 2016.

hjf
fonte

Respostas:

34

Pense no design do índice como um interruptor deslizante. Você pode mover esse botão do triângulo vermelho para qualquer lugar ao longo da linha que desejar:

Decisões de design de índice

Normalmente, não o avalio em termos de tamanho - normalmente penso em termos de quantidade de índice, mas o tamanho também seria bom.

Parece que seu DBA acha que a opção está muito à direita - que você adicionou muitos índices e que as exclusões / atualizações / inserções estão executando muito lentamente.

Em vez de discutir sobre onde está a opção, tente perguntar a ele sobre os problemas de desempenho que você está tendo devido ao alto número de índices. Talvez seus usuários estejam reclamando da velocidade de exclusão / atualização / inserção, ou ele esteja aguardando o bloqueio ou esteja tendo dificuldades para fazer backup do banco de dados devido ao seu tamanho.

Meu ponto de partida é geralmente 5 e 5: cerca de 5 índices por tabela, com cerca de 5 ou menos campos por índice. Não há nada mágico nesse número - ele vem do fato de eu ter cinco dedos em cada mão, por isso é fácil segurar minhas mãos e explicar a regra.

Pode ser necessário ter muitos índices MENOS que 5 quando sua carga de trabalho é fortemente influenciada pelas operações de exclusão / atualização / inserção e você não possui potência suficiente para acompanhar.

É possível que você tenha muitos MAIS índices quando sua carga de trabalho é principalmente somente leitura ou quando investe muito em hardware (como armazenar em cache todo o banco de dados na memória e ter todo o armazenamento de estado sólido embaixo dele).

Brent Ozar
fonte
4

Além disso, o desejo de ter mais do que os índices "Ozar 5" em uma tabela provavelmente indica que você tem vários tipos diferentes de consultas com muita leitura na tabela.

O que provavelmente indica que você pode se beneficiar de um índice columnstore clusterizado ou não clusterizado na tabela.

Em vez de ter o índice ideal para cada um dos N caminhos de acesso diferentes, um columnstore fornece uma verificação super rápida e a capacidade de ignorar colunas e segmentos de linha desnecessários. Assim, você pode ter um pequeno número de índices BTree para transações super críticas e voltar ao columnstore para todo o resto.

Os índices columnstore foram projetados para funcionar em cargas de trabalho pesadas em OLTP com o SQL Server 2016 ou superior. Consulte a documentação para análise operacional em tempo real .

David Browne - Microsoft
fonte
3

Eu gosto da resposta do Brents e a votei de forma positiva. Eu gostaria de acrescentar outra perspectiva. Trabalhei como usuário, desenvolvedor e DBA e sinto que as opiniões não são relevantes. Acredito que cabe ao usuário (ou parte interessada) decidir como uma consulta é executada e quanto tempo leva para obter resultados. Cabe ao desenvolvedor e ao DBA trabalhar juntos para que isso aconteça.

Se a posição do DBA na sua empresa estiver "encarregada" deste tópico, eles poderão analisar sua consulta e fazer sugestões sobre um melhor design de consulta ou responder pelo desempenho.

Se a consulta e / ou a estrutura de dados não puderem ser modificadas para atingir a meta, acho que se resume a três opções.

  1. Recuperação lenta de dados
  2. Atualização lenta de dados
  3. Mais recursos de hardware $$$$

É claro que toda situação tem muitas variáveis, dependendo de vários fatores comerciais e de tecnologia, mas acredito que as três opções se apliquem à maioria, se não a todos os casos.

Joe
fonte
0

Parece muito rigoroso para proibir índices> tabela. Se sua tabela raramente muda (ou muda à noite quando não há muita concorrência por recursos) e é consultada muito de várias maneiras diferentes, muitos grandes índices podem ser justificados. Os DBAs também devem ter cuidado para não colocar o nariz onde não pertence. Se ele / a você / seu sistema limitar um limite de gigabytes, ele não deve se importar muito com a forma como esse espaço é usado. Se ele está sobrecarregado, talvez seja por isso.

No entanto, há muitas coisas a considerar:

  • Muitos índices tornam as inserções / atualizações / exclusões mais lentas. Portanto, se a sua mesa mudar muito, tome cuidado para não fazer muitas delas.
  • O espaço também pode ser um problema. Não apenas porque os gigabytes custam dinheiro (não muito hoje em dia), mas também o tempo decorrido desde que o backup será mais lento (dependendo de como o backup for feito).
  • Os bancos de dados mais sérios podem ser monitorados para encontrar índices que raramente ou nunca são usados. Considere largar alguns deles.
  • Às vezes, você acha que precisa de um índice, mas, ao examinar mais de perto sua consulta, ela pode ser ajustada e reescrita de maneira diferente com o mesmo resultado e sem a necessidade do índice. Use o plano de explicação para ver se o índice é usado ou não.
  • Às vezes, as últimas colunas podem ser removidas de um índice de várias colunas sem muito impacto no desempenho. E, às vezes, isso pode até tornar as consultas mais rápidas, porque o espaço de armazenamento do índice é menor e mais índice é mantido / armazenado em cache na memória a qualquer momento.
  • Os índices baseados em funções podem substituir os normais para economizar mais espaço. Exemplo: em vez de consultar o sobrenome completo, consulte também as duas primeiras letras ( where substr(surname, 1, 2) = substr(<userinput>, 1, 2) and surname=<userinput>) ecreate index i on customers(substr(surname,1,2)) . Isso pode ser rápido o suficiente e seu índice será menor.
  • Bancos de dados oferecem suporte a diferentes tipos de índices. Alguns tipos usam menos espaço que outros. Talvez alguns de seus índices possam ser convertidos para um tipo que consome menos espaço? Certifique-se de entender primeiro os diferentes tipos de índice e para quais situações elas são boas e ruins.
  • Se um trabalho em lote não frequente for a única coisa que precisa de um índice específico, considere criar esse índice apenas para esse trabalho em lotes e solte-o posteriormente.
Kjetil S.
fonte