Quais são as diferenças entre a clustered
e a non-clustered index
?
Quais são as diferenças entre a clustered
e a non-clustered index
?
Respostas:
Índice agrupado
Índice não clusterizado
Os dois tipos de índice aprimoram o desempenho ao selecionar dados com campos que usam o índice, mas retardam as operações de atualização e inserção.
Devido à inserção e atualização mais lenta, os índices clusterizados devem ser configurados em um campo normalmente incremental, como ID ou carimbo de data / hora.
O SQL Server normalmente usará apenas um índice se sua seletividade estiver acima de 95%.
Os índices agrupados ordenam fisicamente os dados no disco. Isso significa que nenhum dado extra é necessário para o índice, mas pode haver apenas um índice em cluster (obviamente). O acesso a dados usando um índice em cluster é mais rápido.
Todos os outros índices devem estar sem cluster. Um índice não clusterizado possui uma duplicata dos dados das colunas indexadas mantidas ordenadas juntamente com ponteiros para as linhas de dados reais (ponteiros para o índice clusterizado, se houver um). Isso significa que o acesso a dados através de um índice não clusterizado precisa passar por uma camada extra de indireção. No entanto, se você selecionar apenas os dados disponíveis nas colunas indexadas, poderá recuperá-los diretamente dos dados duplicados do índice (é por isso que é uma boa ideia SELECIONAR apenas as colunas que você precisa e não usa *)
Os índices agrupados são armazenados fisicamente na tabela. Isso significa que eles são os mais rápidos e você pode ter apenas um índice em cluster por tabela.
Os índices não agrupados em cluster são armazenados separadamente e você pode ter quantos quiser.
A melhor opção é definir o índice clusterizado na coluna exclusiva mais usada, geralmente a PK. Você sempre deve ter um índice clusterizado bem selecionado em suas tabelas, a menos que um motivo muito convincente - não consiga pensar em um único, mas, ei, pode estar lá fora - para não aparecer.
Além dessas diferenças, você deve saber que, quando a tabela não está em cluster (quando a tabela não possui um índice em cluster), os arquivos de dados não são ordenados e usa a estrutura de dados Heap como estrutura de dados.
Prós:
Os índices agrupados funcionam muito bem para intervalos (por exemplo, selecione * da minha_tabela onde minha_chave entre @min e @max)
Em algumas condições, o DBMS não precisará trabalhar para classificar se você usar uma instrução orderby.
Contras:
Os índices agrupados podem diminuir a velocidade das inserções, pois os layouts físicos dos registros precisam ser modificados à medida que os registros são inseridos, se as novas chaves não estiverem em ordem seqüencial.
Um índice agrupado é essencialmente uma cópia ordenada dos dados nas colunas indexadas.
A principal vantagem de um índice em cluster é que, quando sua consulta (busca) localiza os dados no índice, não é necessário E / S adicional para recuperar esses dados.
A sobrecarga de manter um índice em cluster, especialmente em uma tabela atualizada com freqüência, pode levar a um desempenho ruim e, por esse motivo, pode ser preferível criar um índice não em cluster.
Um banco de dados indexado possui duas partes: um conjunto de registros físicos, organizados em alguma ordem arbitrária, e um conjunto de índices que identificam a sequência na qual os registros devem ser lidos para produzir um resultado classificado por algum critério. Se não houver correlação entre o arranjo físico e o índice, a leitura de todos os registros em ordem poderá exigir muitas operações de leitura independentes de registro único. Como um banco de dados pode ler dezenas de registros consecutivos em menos tempo do que seria necessário para ler dois registros não consecutivos, o desempenho pode melhorar se os registros consecutivos no índice também forem armazenados consecutivamente no disco.
Por exemplo, se alguém começar com um banco de dados não clusterizado vazio e adicionar 10.000 registros em sequência aleatória, provavelmente os registros serão adicionados no final na ordem em que foram adicionados. Ler o banco de dados em ordem pelo índice exigiria 10.000 leituras de um registro. Se alguém usar um banco de dados em cluster, no entanto, o sistema poderá verificar ao adicionar cada registro se o registro anterior foi armazenado por si próprio; se for esse o caso, pode gravar esse registro com o novo no final do banco de dados. Ele poderia examinar o registro físico antes dos slots nos quais os registros movidos residiam e ver se o registro a seguir foi armazenado por si só. Se fosse esse o caso, poderia mover esse registro para aquele local. O uso desse tipo de abordagem faria com que muitos registros fossem agrupados em pares,
Na realidade, os bancos de dados em cluster usam algoritmos mais sofisticados que isso. Uma coisa importante a ser observada, porém, é que há uma troca entre o tempo necessário para atualizar o banco de dados e o tempo necessário para lê-lo sequencialmente. Manter um banco de dados em cluster aumentará significativamente a quantidade de trabalho necessária para adicionar, remover ou atualizar registros de qualquer maneira que afete a sequência de classificação. Se o banco de dados for lido em seqüência muito mais frequentemente do que será atualizado, o armazenamento em cluster pode ser uma grande vitória. Se ele for atualizado com frequência, mas raramente for lido em sequência, o armazenamento em cluster pode ser um grande problema de desempenho, especialmente se a sequência na qual os itens são adicionados ao banco de dados for independente da ordem de classificação em relação ao índice em cluster.
Você pode ter passado pela parte teórica das postagens acima:
-O Índice agrupado, como podemos ver, aponta diretamente para o registro, ou seja, é direto, portanto, leva menos tempo para uma pesquisa. Além disso, não será necessário espaço / memória extra para armazenar o índice
-Enquanto no Índice não agrupado, ele aponta indiretamente para o Índice agrupado e acessa o registro real, devido à sua natureza indireta, levará mais tempo para acessar.Também precisa de sua própria memória / espaço para armazenar o índice
// Copiado do MSDN, o segundo ponto do índice não clusterizado não é mencionado claramente nas outras respostas.
Agrupado
Não clusterizado