Eu tenho uma tabela com milhões de linhas. Esta tabela tem uma coluna que filtramos com frequência (significa que a usamos na cláusula WHERE com frequência), os valores são Inserir/Atualizar/Ignorado. Faz sentido adicionar índice às colunas? Alguém me disse que adicionar índice na coluna de poucos valores não traz nenhum benefício
relate perguntas
-
SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado
-
Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?
-
Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?
-
Quais são as principais causas de deadlocks e podem ser evitadas?
-
Como determinar se um Índice é necessário ou necessário
Adicionar índice na coluna de baixa cardinalidade pode fazer sentido, por exemplo, no caso de você precisar procurar um valor que é bastante raro - digamos que você tenha o estado da coluna com possibilidades de novo/processado e 95% das linhas definidas como processadas, e você precisa obter essas novas frequentemente - então o índice irá ajudá-lo a encontrá-los rapidamente. Mas tê-lo presente significa que o otimizador pode tentar usar em casos ruins.
Normalmente, é sugerido não indexar essa coluna por si só, mas usá-la como parte do índice de várias colunas, o que pode ajudar em consultas específicas (por exemplo - você deseja processar esses novos registros do mais antigo para o mais novo e, em seguida, adiciona o índice em (State, CreatedTime ) e consulte-o como "where State = 'New' order by CreatedTime ASC" e esse índice permitirá que você tenha esses novos rapidamente e já solicitados.
Se você tiver um índice apenas com o campo de status, provavelmente ele não será usado porque, para cada linha encontrada no índice, o restante das colunas selecionadas deve ser obtido do índice clusterizado e essas pesquisas de chave serão caras e provavelmente são mais eficiente apenas para verificar o índice clusterizado.
Se você tiver outros campos na cláusula where, um índice composto deve funcionar melhor. Ter o campo de status lá depende também do fato de estar sendo atualizado (frequentemente), pois isso também exigirá a manutenção do índice.
Uma opção é adicionar os campos que você possui na parte selecionada como colunas incluídas. Dessa forma, a consulta não precisa ir para o índice clusterizado e deve funcionar bem rápido. Você deve tentar isso para ver se realmente funciona no seu caso. É claro que haverá sobrecarga de manutenção que depende de várias coisas, especialmente da frequência com que os campos incluídos no índice são atualizados.
Se houver um status raro e usado para buscar linhas, o índice filtrado pode funcionar, mas presumo que não seja o seu caso.