Suponha que eu tenha uma tabela com as colunas abaixo:
Id int identidade, UserId
Qual seria a melhor abordagem:
Making Id PRIMARY KEY CLUSTERED
Creating NONCLUSTERED Index on UserId
OU
Making Id PRIMARY KEY CLUSTERED
Creating NONCLUSTERED Index on UserId, Id
OU
Making Id PRIMARY KEY NONCLUSTERED
Creating CLUSTERED Index on UserId
OU
Making Id PRIMARY KEY NONCLUSTERED
Creating CLUSTERED Index on UserId, Id
OU
Just making a composite CLUSTERED PRIMARY KEY including both columns Id, UserId
Atualizar
Atualizar/excluir é baseado em UserId e Id, enquanto as recuperações são baseadas em UserId.
Eu leio principalmente a tabela por ID do usuário. Como um usuário pode ter vários registros nesta tabela e para modificar um registro específico de um usuário, por exemplo, para operações de atualização/exclusão, eu precisaria de id e userid para identificar exclusivamente o registro.
a referência à sua tabela for adequada para ter uma chave composta (userid, id). Certifique-se de que o pedido seja (userid, id) e não (id, userid)
Na opção 5 - se houver uma tabela filha ela deverá referenciar não apenas por id, mas por userid e id
Atualização Com base na resposta acima do comentário de SergeyA e Dan Guzman. Parece que a opção 5, ou seja, chave composta (userid, id) é a melhor opção. Porque provavelmente otimizará a recuperação de linhas por UserID e também atualizará/excluirá operações quando ambas as colunas forem especificadas.
Obrigado a todos por sua ajuda.
Tornando o Id PRIMARY KEY CLUSTERED e criando o índice NONCLUSTERED no UserId:
Tornando o Id PRIMARY KEY CLUSTERED e criando o índice NONCLUSTERED no UserId, Id:
Tornando o Id PRIMARY KEY NONCLUSTERED e criando o índice CLUSTERED no UserId:
Tornando Id PRIMARY KEY NONCLUSTERED e criando índice CLUSTERED em UserId, Id:
Fazendo uma CLUSTERED PRIMARY KEY composta incluindo Id de ambas as colunas, UserId: