Eu tenho uma tabela do SQL Server 2014 que se parece com o seguinte:
OrderId int not null IDENTITY --this is the primary key column
OrderDate datetime2 not null
CustomerId int not null
Description nvarchar(255) null
Algumas pessoas da minha equipe sugeriram que o índice clusterizado deveria estar ativado OrderId, mas acho que o CustomerId+ OrderIdseria uma opção melhor pelos seguintes motivos:
- Quase todas as consultas serão visualizadas
WHERE CustomerId = @param, nãoOrderId CustomerIdé uma chave estrangeira para aCustomertabela, portanto, ter um índice clusterizado comCustomerIddeve acelerar as junções- Embora
CustomerIdnão seja exclusivo, ter aOrderIdcoluna adicional especificada no índice garantirá a exclusividade (podemos usar aUNIQUEpalavra - chave ao criar o índice clusterizado nessas duas colunas, para evitar a sobrecarga de não ter exclusividade) - Depois que os dados são inseridos,
CustomerIdeOrderIdnunca mudam, para que essas linhas não se movam após a gravação inicial. - O acesso aos dados acontece por meio de um ORM que solicita todas as colunas por padrão; portanto, quando uma consulta baseada em
CustomerIdchega, o índice clusterizado poderá fornecer todas as colunas sem nenhum trabalho adicional.
A abordagem CustomerIde OrderIdparece a melhor opção, considerando o exposto acima? Ou, OrderIdpor si só , é melhor, já que é uma coluna única que garante a exclusividade por si só?
Atualmente, a tabela possui um índice clusterizado OrderIde um índice não clusterizado CustomerId, mas não está cobrindo, portanto, como estamos usando um ORM e todas as colunas são solicitadas, é trabalho extra recuperá-las. Portanto, neste post, estou tentando considerar melhorar o desempenho com um IC melhor.
A atividade em nosso banco de dados é de cerca de 85% de leituras e 15% de gravações.