Por padrão, o PK está agrupado e, na maioria dos casos, isso é bom. No entanto, qual pergunta deve ser feita:
- meu PK deve ser agrupado?
- quais colunas serão a melhor chave para o meu índice em cluster?
PK e índice clusterizado são duas coisas diferentes:
- PK é uma restrição. PK é usado para identificar linhas com exclusividade, mas não há noção de armazenamento. No entanto, por padrão (no SSMS), ele é imposto por um índice em cluster exclusivo se um índice em cluster ainda não estiver presente.
- Índices em cluster é um tipo especial de índice que armazena dados de linha no nível da folha, o que significa que está sempre cobrindo. Todas as colunas, sejam elas parte da chave ou não, são armazenadas no nível da folha. Ele não precisa ser exclusivo; nesse caso, um uniquificador (4 bytes) é adicionado à chave em cluster.
Agora, terminamos com duas perguntas:
- Como desejo identificar exclusivamente linhas na minha tabela (PK)
- Como desejo armazená-lo no nível folha de um índice (Índice de Cluster)
Depende de como:
- você cria seu modelo de dados
- você consulta seus dados e escreve suas consultas
- você insere ou atualiza seus dados
- ...
Primeiro, você precisa de um índice em cluster? Se você inserir em massa, é mais eficiente armazenar dados não ordenados em um HEAP (versus dados ordenados em um cluster). Ele usa o RID (identificador de linha, 8 bytes) para identificar exclusivamente as linhas e armazená-las nas páginas.
O índice clusterizado não deve ser um valor aleatório. Os dados no nível da folha serão armazenados e ordenados pela chave de índice. Portanto, ele deve crescer continuamente para evitar fragmentação ou divisão de página. Se isso não puder ser alcançado pela PK, considere outra chave como candidato em cluster. O índice agrupado nas colunas de identificação, o GUID seqüencial ou mesmo algo como a data da inserção é bom do ponto de vista seqüencial, pois todas as linhas serão adicionadas à última página de folha. Por outro lado, embora o identificador exclusivo possa ser útil para as necessidades da sua empresa como PK, eles não devem ser agrupados (eles são ordenados / gerados aleatoriamente).
Se, após algumas análises de dados e consultas, você descobrir que usa o mesmo índice para obter seus dados antes de fazer uma pesquisa de chave na PK em cluster, considere-o como índice em cluster, embora possa não identificar exclusivamente seus dados.
A chave de índice em cluster é composta por todas as colunas que você deseja indexar. Uma coluna uniquefier (4 bytes) será adicionada se não houver restrição exclusiva nela (valor incremental para duplicatas, nulo caso contrário). Essa chave de índice será armazenada uma vez para cada linha no nível da folha de todos os seus índices não clusterizados. Alguns deles também serão armazenados várias vezes em níveis intermediários (ramificação) entre a raiz e o nível das folhas da árvore de índice (árvore B). Se a chave for muito grande, todo o índice não clusterizado ficará maior, exigirá mais armazenamento e mais IO, CPU, memória, ... Se você tiver um PK em nome + data de nascimento + país, é muito provável que essa chave não é um bom candidato. É muito grande para um índice em cluster. O identificador exclusivo usando NEWSEQUENTIALID () geralmente não é considerado uma chave estreita (16 bytes), embora seja seqüencial.
Depois que você descobrir como identificar linhas exclusivamente em sua tabela, poderá adicionar uma PK. Se você acha que não o usará em sua consulta, não o crie em cluster. Você ainda pode criar outro índice não clusterizado se precisar, em algum momento, consultá-lo. Observe que o PK criará automaticamente um índice exclusivo.
Os índices não agrupados sempre conterão a chave agrupada. No entanto, se as colunas indexadas (+ colunas principais) estiverem cobrindo, não haverá nenhuma pesquisa de chave no índice clusterizado. Não esqueça que você também pode adicionar Incluir e Onde a um índice não agrupado. (use-o com sabedoria)
O índice de cluster deve ser único e o mais estreito possível. O índice de cluster não deve mudar ao longo do tempo e deve ser inserido de forma incremental.
Agora é hora de escrever um pouco de SQL que criará a tabela, índices e restrições em cluster e não em cluster.
Isso tudo é teórico, porque não conhecemos seu modelo de dados e tipos de dados usados (A e B).