Eu tenho uma tabela com cerca de 1 a 5 milhões de registros. Uma pequena parte desses registros possui uma coluna de bits definida como 'TRUE'. Precisa encontrar rapidamente esses registros. Eu acho que esse índice pode acelerar a pesquisa nessa coluna, mas eu tenho medo dos INSERTs. Daí a minha pergunta.
O banco de dados está funcionando como uma espécie de armazém de dados; portanto, existem muitos SELECTs e INSERTs pequenos (até 10 a 20 por dia), mas bastante grandes (até 200 mil registros ao mesmo tempo). Eu tenho medo de mais tempo dessas importações para o banco de dados.
sql-server
sql-server-2005
marioosh
fonte
fonte
Respostas:
Um índice de 1 milhão de registros é inútil. O otimizador nunca o usará, você pagará apenas pela manutenção. Uma alternativa muito melhor é adicionar esse bit como a chave mais à esquerda no índice em cluster.
Mas farei um tiro cego no escuro e acho que o que você tem é um padrão de fila: os registros são descartados na tabela com o bit definido como 'TRUE' (ou seja, 'needsprocessing = true') e, em seguida, um processo em segundo plano parece para esses registros, realiza algum processamento e atualiza o bit para FALSE. Esse é um padrão onipresente, também conhecido carinhosamente como o 'padrão de receita de desastre de desempenho'. Eu recomendaria soltar os registros na tabela e soltar uma notificação (poderia ser tão simples quanto o ID do registro recém-inserido), ao mesmo tempo, em uma fila . Consulte Usando tabelas como filas .
fonte
Como o @MartinSmith disse, se você atualizar para o SQL 2008, um índice filtrado seria a solução perfeita. No entanto, nesse meio tempo, como um caso geral, QUALQUER índice adicionado aumentará o tempo de carregamento. Índices pequenos menos que os grandes.
Uma coisa que eu observaria é se você tem um índice existente que pode ser modificado. Supondo que suas consultas existentes estejam usando um determinado índice, a adição da coluna de bits ao final desse índice deve ter um efeito mínimo nas inserções e o efeito positivo que você procura nas suas consultas.
A próxima coisa a considerar é "Já tenho muitos índices?" Não existe uma regra rígida e rápida sobre o que é "muito", mas eu costumo seguir uma regra de 10 índices, a menos que eu realmente precise de um novo.
Por último, teste-o em uma instância de teste. Configure uma tabela com alguns milhões de linhas, execute sua carga nela, adicione seu índice, execute sua carga novamente e veja se você percebe um aumento significativo no tempo de carregamento.
Somente você pode realmente decidir o que é "significativo". Eu tenho máquinas em que adicionar 5 minutos ao tempo de carregamento é "significativo" e outras em que pude ver com segurança um aumento de duas horas.
EDITAR:
Outra opção é particionar sua tabela. Pode ser necessário usar uma exibição particionada se você não estiver usando a edição Enterprise, mas mesmo assim deve ajudar. Você coloca seu bit 0s em uma partição e seu bit 1s em outra. Supondo que você esteja inserindo apenas uma versão ou outra, você poderá até acelerar suas inserções.
fonte