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
+ OrderId
seria uma opção melhor pelos seguintes motivos:
- Quase todas as consultas serão visualizadas
WHERE CustomerId = @param
, nãoOrderId
CustomerId
é uma chave estrangeira para aCustomer
tabela, portanto, ter um índice clusterizado comCustomerId
deve acelerar as junções- Embora
CustomerId
não seja exclusivo, ter aOrderId
coluna adicional especificada no índice garantirá a exclusividade (podemos usar aUNIQUE
palavra - 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,
CustomerId
eOrderId
nunca 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
CustomerId
chega, o índice clusterizado poderá fornecer todas as colunas sem nenhum trabalho adicional.
A abordagem CustomerId
e OrderId
parece a melhor opção, considerando o exposto acima? Ou, OrderId
por si só , é melhor, já que é uma coluna única que garante a exclusividade por si só?
Atualmente, a tabela possui um índice clusterizado OrderId
e 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.