A questão não é 'quando o PK deve ser NC', mas, em vez disso, você deve perguntar 'qual é a chave apropriada para o índice em cluster'?
E a resposta realmente depende de como você consulta os dados . O índice clusterizado tem uma vantagem sobre todos os outros índices: como sempre inclui todas as colunas, está sempre cobrindo. Portanto, as consultas que podem alavancar o índice clusterizado certamente não precisam usar pesquisas para satisfazer algumas das colunas e / ou predicados projetados.
Outra peça do quebra-cabeça é como um índice pode ser usado ? Existem três padrões típicos:
- análises, quando um único valor-chave é procurado no índice
- varreduras de intervalo, quando um intervalo de valores-chave é recuperado
- ordem por requisitos, quando um índice pode satisfazer uma ordem sem requerer uma classificação de interrupção
Portanto, se você analisar sua carga esperada (as consultas) e descobrir que um grande número de consultas usaria um índice específico porque elas usam um certo padrão de acesso que se beneficia de um índice, faz sentido propor esse índice como o índice clusterizado.
Ainda outro fator é que a chave de índice em cluster é a chave de pesquisa usada por todos os índices não em cluster e, portanto, uma chave de índice em cluster amplo cria um efeito cascata e amplia todos os índices não em cluster e os índices amplos significam mais páginas, mais E / S , mais memória, menos bondade.
Um bom índice de cluster é estável , não muda durante a vida útil da entidade, porque uma alteração nos valores da chave de índice em cluster significa que a linha deve ser excluída e inserida novamente.
E um bom índice de cluster cresce em ordem não aleatória (cada valor de chave recém-inserido é maior que o valor anterior) para evitar divisões e fragmentação de página (sem mexer com FILLFACTOR
s).
Portanto, agora que sabemos o que é uma boa chave de índice em cluster, a chave primária (que é uma propriedade lógica da modelagem de dados) corresponde aos requisitos? Se sim, o PK deve ser agrupado. Se não, o PK deve estar sem cluster.
Para dar um exemplo, considere uma tabela de fatos de vendas. Cada entrada possui um ID que é a chave primária. Mas a grande maioria das consultas solicita dados entre uma data e outra data; portanto, a melhor chave de índice em cluster seria a data de vendas , não o ID . Outro exemplo de ter um índice de cluster diferente da chave primária é uma chave de seletividade muito baixa, como uma 'categoria' ou um 'estado', uma chave com apenas muito poucos valores distintos. Ter uma chave de índice em cluster com essa chave de baixa seletividade como a chave mais à esquerda, por exemplo (state, id)
, geralmente faz sentido devido às varreduras de intervalos que procuram todas as entradas em um determinado 'estado'.
Uma última observação sobre a possibilidade de uma chave primária não agrupada em cluster sobre uma pilha (ou seja, não há nenhum índice agrupado). Pode ser um cenário válido, o motivo típico é quando o desempenho da inserção em massa é crítico, pois os heaps têm uma taxa de transferência de inserção em massa significativamente melhor quando comparados aos índices em cluster.