Quais são as diferenças entre um índice agrupado e um não agrupado?

277

Quais são as diferenças entre a clusterede a non-clustered index?

Eric Labashosky
fonte
8
Você pode ter apenas um índice em cluster por tabela. Mas há muitas outras diferenças ...
Tom Robinson
5
Um índice em cluster, na verdade, descreve a ordem em que os registros são fisicamente armazenados no disco, daí o motivo de você ter apenas um. Um índice não clusterizado define uma ordem lógica que não corresponde à ordem física no disco.
Josh
1
Agrupado significa basicamente que os dados estão nessa ordem física na tabela. É por isso que você pode ter apenas um por tabela. Sem cluster significa que é "apenas" uma ordem lógica.
Biri
2
@biri o que é ordem "lógica"? a Índice não clusterizado armazena as chaves de índice em ordem fisicamente e armazena um ponteiro na tabela, ou seja, a chave de índice clusterizado.
Stephanie Página
@ Stephanie Page: lógica do ponto de vista da tabela. Obviamente, os índices não agrupados em cluster são ordenados fisicamente no próprio índice.
Biri

Respostas:

268

Índice agrupado

  • Apenas um por mesa
  • Mais rápido de ler do que não agrupado, pois os dados são fisicamente armazenados na ordem do índice

Índice não clusterizado

  • Pode ser usado várias vezes por mesa
  • Mais rápido para operações de inserção e atualização do que um índice em cluster

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%.

Martynnw
fonte
9
Há também considerações de armazenamento. Ao inserir linhas em uma tabela sem índice clusterizado, as linhas são armazenadas lado a lado na página e a atualização de uma linha pode resultar na movimentação da linha para o final da tabela, deixando espaço em branco e fragmentando a tabela e os índices.
Jeremiah Peschka 18/09/08
4
você não precisa se preocupar com o que é x. Tudo que você precisa saber é que para um aplicativo com milhões de usuários, x será significativo
Pacerier
14
É puramente dogma. Não é "mais rápido de ler porque os dados são armazenados em ordem". É mais rápido ler porque você evita a leitura de um índice E ENTÃO a tabela é lida. É mais rápido a varredura de alcance (se isso for significativo) porque os dados são armazenados em ordem. isto é, o fator de agrupamento é perfeito.
Stephanie Página
6
Também a ideia de que 95% dos registros precisam ser exclusivos é uma falácia. Digamos que você tenha uma tabela com 1.000.000 de linhas e indexe uma coluna com 500.000 de chaves. 0% são únicos, mas cada chave retorna 2 de um milhão de linhas. Esse índice é absolutamente útil, independentemente de 0% dos registros serem exclusivos.
Stephanie Página
2
"dados são fisicamente armazenados em ordem de índice", o que você quer dizer com isso? Em um nível, isso é trivialmente verdadeiro, porque as páginas de dados e as páginas de índice são uma e a mesma - então, obviamente, a ordem de uma descreve a ordem da outra. No entanto, este não é necessariamente em qualquer ordem específica, como ordem da chave de índice stackoverflow.com/questions/1251636/...
Martin Smith
79

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 *)

rslite
fonte
3
'No entanto, se você selecionar apenas os dados disponíveis nas colunas indexadas, poderá recuperá-los diretamente dos dados duplicados do índice' - sim, essa é a exceção importante à heurística do índice preferencial em cluster. Acho que, nesse caso, você basicamente possui um índice em cluster, mas menos dados na tabela que você está consultando, portanto, potencialmente, pode ser lido mais rapidamente no disco.
satnhak
34

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.

Santiago Cepas
fonte
3
você pode elaborar mais sobre "devemos sempre ter um índice agrupado em nossas tabelas"? sem elaboração dessa afirmação é simplesmente errado por causa da palavra sempre
Pacerier
1
Você está certo, Pacerier, não se deve usar declarações absolutas de ânimo leve. Embora eu não conheça um único caso em que você não deva ter um índice de cluster bem selecionado, esse caso pode existir, então mudei minha resposta para uma versão mais genérica.
Santiago Cepas
28

Índice agrupado

  1. Pode haver apenas um índice em cluster para uma tabela.
  2. Geralmente feito na chave primária.
  3. Os nós folha de um índice em cluster contêm as páginas de dados.

Índice não clusterizado

  1. Pode haver apenas 249 índices não agrupados em cluster para uma tabela (até a versão sql 2005 versões posteriores suportam até 999 índices não agrupados).
  2. Geralmente feito em qualquer tecla.
  3. O nó folha de um índice não clusterizado não consiste nas páginas de dados. Em vez disso, os nós folha contêm linhas de índice.
Jojo
fonte
24

Índice agrupado

  • Apenas um índice em cluster pode estar lá em uma tabela
  • Classifique os registros e armazene-os fisicamente de acordo com a ordem
  • A recuperação de dados é mais rápida que os índices não agrupados em cluster
  • Não precisa de espaço extra para armazenar estrutura lógica

Índice não clusterizado

  • Pode haver qualquer número de índices não agrupados em uma tabela
  • Não afeta a ordem física. Crie uma ordem lógica para linhas de dados e use ponteiros para arquivos de dados físicos
  • A inserção / atualização de dados é mais rápida que o índice em cluster
  • Use espaço extra para armazenar estrutura lógica

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.

Lasitha Yapa
fonte
10

Clusterizado significa basicamente que os dados estão nessa ordem física na tabela. É por isso que você pode ter apenas um por tabela.

Sem cluster significa que é "apenas" uma ordem lógica.

Biri
fonte
9

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.

Giovanni Galbo
fonte
6

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.

Ed Guiness
fonte
6

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.

supercat
fonte
5

Um índice em cluster, na verdade, descreve a ordem em que os registros são fisicamente armazenados no disco, daí o motivo de você ter apenas um.

Um índice não clusterizado define uma ordem lógica que não corresponde à ordem física no disco.

Josh
fonte
2

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

insira a descrição da imagem aqui

Nandkishor Nangre
fonte
0

// Copiado do MSDN, o segundo ponto do índice não clusterizado não é mencionado claramente nas outras respostas.

Agrupado

  • Os índices agrupados classificam e armazenam as linhas de dados na tabela ou exibição com base em seus valores-chave. Essas são as colunas incluídas na definição de índice. Pode haver apenas um índice em cluster por tabela, porque as próprias linhas de dados podem ser armazenadas em apenas uma ordem.
  • O único momento em que as linhas de dados de uma tabela são armazenadas em ordem classificada é quando a tabela contém um índice em cluster. Quando uma tabela possui um índice em cluster, ela é chamada de tabela em cluster. Se uma tabela não tiver um índice clusterizado, suas linhas de dados serão armazenadas em uma estrutura não ordenada chamada heap.

Não clusterizado

  • Os índices não clusterizados têm uma estrutura separada das linhas de dados. Um índice não clusterizado contém os valores da chave de índice não clusterizado e
    cada entrada do valor da chave possui um ponteiro para a linha de dados que contém o valor da chave.
  • O ponteiro de uma linha de índice em um índice não clusterizado para uma linha de dados é chamado de localizador de linhas. A estrutura do localizador de linhas depende se as páginas de dados são armazenadas em um heap ou em uma tabela em cluster. Para um heap, um localizador de linhas é um ponteiro para a linha. Para uma tabela em cluster, o localizador de linhas é a chave de índice em cluster.
Deepak Mishra
fonte