Vamos supor que temos uma tabela da seguinte forma:
PK -- nonclustered primary key
Col1 -- unique clustered
Col2
Col3
Este índice é:
nonclustered index on (Col2, Col3)
diferente deste índice:
nonclustered index on (Col2, Col3) include (PK)
E se meu PK for clusterizado em vez de não clusterizado? Agora faz/não faz diferença?
Edite para adicionar:
Suponho que esta seja uma maneira indireta de perguntar: o ponteiro do índice não clusterizado está de volta à tabela com base no índice clusterizado ou na chave primária? Eu suponho que o RID de índice clusterizado é o que é usado.
A chave de índice clusterizado é incluída em todos os índices não clusterizados como o identificador de linha.
O SQL Server apenas ignora uma
INCLUDE
das chaves de índice clusterizado.Se o seu índice PK for
NONCLUSTERED
, ele não será incluído em todas as linhas de todos os outros índices NC.Você pode testar isso fazendo dois índices idênticos, um com
INCLUDE(ClusterKey)
e outro sem, e comparar os tamanhos. Eles serão idênticos, mesmo em centenas de milhões de linhas.Imagine se cada índice não clusterizado contivesse a chave primária, como você supõe:
Isso, com base em sua tabela, presumivelmente incluiria o índice não clusterizado que está implementando sua chave primária. Imagine que você está executando uma consulta na tabela e o índice de chave primária é usado. Não há como, tendo usado esse índice, encontrar os dados restantes da tabela. Portanto, não pode ser assim que as coisas funcionam.
Ou outra hipótese:
Todo índice não clusterizado que não é o índice de chave primária armazena a chave primária. Se o índice de chave primária não estiver agrupado, ele conterá algum outro valor mágico (por exemplo, a chave agrupada). Mas isso significa que qualquer consulta que usa um índice de chave não primária e não clusterizado agora deve executar o dobro de operações de índice - uma vez em seu próprio índice e uma segunda em relação ao índice de chave primária. E também precisaríamos de duas implementações separadas de índices não agrupados.
Como nenhum deles é um bom ajuste, espera-se que seja óbvio por que os índices não clusterizados armazenam a chave do índice clusterizado, em vez de qualquer outra coisa.
Se o PK for um PK clusterizado, o PK será incluído em todos os índices que você criar, exceto para um índice não clusterizado exclusivo. Se você precisar da coluna PK no índice não clusterizado exclusivo, ainda precisará incluir a coluna.