Em um esforço para ser mais eficiente ao criar um novo índice, se já existe um índice com as mesmas chaves de índice, mas ele simplesmente precisa de colunas de inclusão adicionais, é melhor criar um segundo índice (novamente, com as mesmas chaves) com diferentes incluem colunas? Ou seria mais eficiente para o mecanismo de consulta (não recriar o índice) recriar o índice e adicionar as colunas de inclusão ao conjunto de colunas de inclusão original?
Se simplesmente adicionar as colunas de inclusão ao índice existente, importa a ordem em que as colunas de inclusão são anexadas?
Existe um cenário em que faria mais sentido criar um segundo índice, duplicando as chaves de índice, mas com um conjunto diferente de colunas de inclusão?
Eu tentei simplificar esta questão no código abaixo.
CREATE NONCLUSTERED INDEX [IX_Index_A] ON [dbo].[Table]
([Col1] ASC)
INCLUDE ([Col2])
CREATE NONCLUSTERED INDEX [IX_Index_B] ON [dbo].[Table]
([Col1] ASC)
INCLUDE ([Col3],[Col4])
OU
DROP INDEX [IX_Index_A] ON [dbo].[Table]
CREATE NONCLUSTERED INDEX [IX_Index_A] ON [dbo].[Table]
([Col1] ASC)
INCLUDE ([Col2],[Col3],[Col4])
A ordem dos campos incluídos não importa, pois não há classificação envolvida - esses campos estão disponíveis no nível folha do índice para cada linha.
Não há realmente uma desvantagem em consolidá-los como no segundo exemplo, exceto pela densidade da página nesse índice (mais páginas lidas por número de linhas, pois há mais dados armazenados para cada linha).
No entanto, EXISTEM vantagens mensuráveis - para atualizações/inserções,
Col1
você só precisa atualizar um índice em vez de dois e economizará muito espaço ao não manter entradas de chave duplicadascol1
em dois índices separados.O único cenário em que consigo pensar que faria sentido ter os dois índices mais estreitos é se um deles foi projetado especificamente para um procedimento ou exibição de missão crítica. Se você tiver um índice que inclua apenas o que você precisa para uma determinada consulta executada com alta frequência, faria sentido mantê-lo o mais simplificado possível.
Eu diria que consolidar seus índices neste caso, pois para cada inserção, exclusão e atualizações apropriadas exigiria manutenção de índice * n índices. Além disso, você pode usar WITH (DROP_EXISTING = ON, ONLINE = ON) para reduzir a interrupção se tiver o Enterprise Edition.