web-dev-qa-db-pt.com

O que o índice Clustered e Non clustered realmente significa?

Eu tenho uma exposição limitada ao banco de dados e usei apenas o DB como um programador de aplicativos. Eu quero saber sobre Clustered e Non clustered indexes. Eu pesquisei e o que eu encontrei foi:

Um índice clusterizado é um tipo especial de índice que reordena a maneira como os registros Na tabela são fisicamente Armazenados. Portanto, a tabela pode ter apenas Um índice agrupado. Os nós de folha De um índice clusterizado contêm as páginas de dados . Um índice não-clusterizado é um tipo de índice especial Em que a ordem lógica Do índice não corresponde À ordem física armazenada de Linhas no disco. O nó folha de um índice não-clusterizado Não consiste em Páginas de dados. Em vez disso, os nós da folha Contêm linhas de índice.

O que eu encontrei em SO foi Quais são as diferenças entre um índice clusterizado e um não agrupado? .

Alguém pode explicar isso em Inglês simples?

897
P.K

Com um índice clusterizado, as linhas são armazenadas fisicamente no disco na mesma ordem que o índice. Portanto, pode haver apenas um índice clusterizado.

Com um índice não agrupado, há uma segunda lista com ponteiros para as linhas físicas. Você pode ter muitos índices não agrupados, embora cada novo índice aumente o tempo necessário para gravar novos registros. 

Geralmente, é mais rápido ler um índice clusterizado se você quiser recuperar todas as colunas. Você não precisa ir primeiro para o índice e depois para a tabela.

Escrever em uma tabela com um índice clusterizado pode ser mais lento, se houver necessidade de reorganizar os dados.

902
Shiraz Bhaiji

Um índice clusterizado significa que você está informando ao banco de dados para armazenar valores de fechamento realmente próximos uns dos outros no disco. Isso tem o benefício de varredura/recuperação rápida de registros que caem em algum intervalo de valores de índice agrupados.

Por exemplo, você tem duas tabelas, Customer e Order:

Customer
----------
ID
Name
Address

Order
----------
ID
CustomerID
Price

Se você deseja recuperar rapidamente todos os pedidos de um cliente específico, convém criar um índice clusterizado na coluna "CustomerID" da tabela Order. Dessa forma, os registros com o mesmo CustomerID serão fisicamente armazenados próximos uns dos outros no disco (em cluster), o que acelera sua recuperação.

P.S. O índice em CustomerID obviamente não será exclusivo, então você precisa adicionar um segundo campo para "uniquificar" o índice ou deixar o banco de dados lidar com isso para você, mas isso é outra história.

Em relação a vários índices. Você pode ter apenas um índice clusterizado por tabela, porque isso define como os dados são organizados fisicamente. Se você deseja uma analogia, imagine uma grande sala com muitas tabelas. Você pode colocar essas tabelas para formar várias linhas ou reuni-las para formar uma grande tabela de conferência, mas não das duas formas ao mesmo tempo. Uma tabela pode ter outros índices, eles apontarão para as entradas no índice clusterizado, que por sua vez finalmente dirão onde encontrar os dados reais.

553
user151323

Percebo que esta é uma questão muito antiga, mas pensei em oferecer uma analogia para ajudar a ilustrar as boas respostas acima.

ÍNDICE CLUSTERED

Se você entrar em uma biblioteca pública, verá que os livros estão todos organizados em uma ordem específica (provavelmente o Dewey Decimal System, ou DDS). Isso corresponde ao "índice clusterizado" dos livros. Se o número de DDS do livro desejado fosse 005.7565 F736s, você começaria localizando a linha de estantes de livros rotulada 001-099 ou algo assim. (Esse sinal final no final da pilha corresponde a um "nó intermediário" no índice.) Eventualmente, você detalharia até a prateleira específica rotulada 005.7450 - 005.7600 e, em seguida, digitalizaria até encontrar o livro com o DDS # especificado e nesse momento você encontrou seu livro

ÍNDICE NÃO CLUSTERADO

Mas se você não entrou na biblioteca com o DDS # do seu livro memorizado, então você precisaria de um segundo índice para ajudá-lo. Antigamente, você encontrava na frente da biblioteca uma maravilhosa escrivaninha conhecida como "Catálogo de Cartões". Nele havia milhares de cartões 3x5 - um para cada livro, classificados em ordem alfabética (por título, talvez). Isso corresponde ao "índice não agrupado". Esses catálogos de cartões foram organizados em uma estrutura hierárquica, de modo que cada gaveta seria rotulada com o intervalo de cartões que continha (Ka - Kl, por exemplo, ou seja, o "nó intermediário"). Mais uma vez, você detalharia até encontrar o seu livro, mas no caso this, depois de encontrá-lo (ou seja, o "nó da folha"), você não tem o livro em si, mas apenas um cartão com um número index (o DDS #) com o qual você poderia encontrar o livro real no índice clusterizado.

É claro que nada impediria o bibliotecário de fotocopiar todos os cartões e classificá-los em uma ordem diferente em um catálogo de cartões separado. (Em geral, havia pelo menos dois desses catálogos: um classificado por nome de autor e um por título.) Em princípio, você poderia ter tantos desses índices "não agrupados" quanto desejar. 

103
kmote

Encontre abaixo algumas características de índices agrupados e não agrupados:

Índices Clusterizados

  1. Índices em cluster são índices que identificam exclusivamente as linhas em uma tabela SQL.
  2. Cada tabela pode ter exatamente um índice clusterizado.
  3. Você pode criar um índice clusterizado que cobre mais de uma coluna. Por exemplo: create Index index_name(col1, col2, col.....).
  4. Por padrão, uma coluna com uma chave primária já possui um índice clusterizado.

Índices não agrupados

  1. Índices não agrupados são como índices simples. Eles são usados ​​apenas para recuperação rápida de dados. Não tenho certeza de ter dados exclusivos.
66
Anirudh Sood

Uma regra prática muito simples e não técnica seria que os índices agrupados geralmente são usados ​​para sua chave primária (ou, pelo menos, uma coluna exclusiva) e que os não agrupados são usados ​​para outras situações (talvez uma chave estrangeira) . De fato, o SQL Server criará, por padrão, um índice clusterizado em sua (s) coluna (s) de chave primária. Como você deve ter aprendido, o índice clusterizado está relacionado à forma como os dados são fisicamente ordenados no disco, o que significa que é uma boa escolha para a maioria das situações.

45
Dan Diplo

Índice clusterizado

Um índice clusterizado determina a ordem física de DATA em uma tabela. Por esse motivo, uma tabela possui apenas um índice clusterizado.

como "dicionário" Não precisa de nenhum outro índice, já é indexado de acordo com palavras 

Índice não clusterizado

Um índice não agrupado é análogo a um índice em um livro. Os dados são armazenados em um local. o índice é armazenado em outro local e o índice tem ponteiros para o local de armazenamento dos dados. Por esse motivo, uma tabela possui mais de um índice não-clusterizado.

como "livro de química" ao olhar, há um índice separado para apontar a localização do capítulo e no "END", há outro índice apontando a localização comum da palavra 

13
abdul rehman kk

Clustered Index

Índices agrupados classificam e armazenam as linhas de dados na tabela ou exibição com base em seus valores de chave. Estas são as colunas incluídas na definição do índice. Pode haver apenas um índice clusterizado por tabela, porque as próprias linhas de dados podem ser classificadas em apenas uma ordem.

A única vez que as linhas de dados em uma tabela são armazenadas na ordem classificada é quando a tabela contém um índice clusterizado. Quando uma tabela possui um índice clusterizado, a tabela é chamada de tabela clusterizada. 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 clicado

Índices não clusterizados têm uma estrutura separada das linhas de dados. Um índice não-clusterizado contém os valores de chave de índice não-clusterizados e cada entrada de valor de chave possui um ponteiro para a linha de dados que contém o valor-chave. O ponteiro de uma linha de índice em um índice não-clusterizado para uma linha de dados é chamado de linha localizador. 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 linha é um ponteiro para a linha. Para uma tabela em cluster, o localizador de linha é a chave de índice em cluster.

Você pode adicionar colunas não chave ao nível de folha do índice não clusterizado para ignorar os limites de chave de índice existentes e executar consultas totalmente cobertas e indexadas. Para mais informações, consulte Criar Índices com Colunas Incluídas. Para obter detalhes sobre limites de chave de índice, consulte Especificações de capacidade máxima para o SQL Server.

Referência: https://docs.Microsoft.com/en-us/sql/relational-databases/indexes/clustered-and-nonclustered-indexes-described

3
marvelTracker

Clustered Index: A restrição de chave primária cria um índice clusterizado automaticamente se não existir um índice clusterizado na tabela. Os dados reais do índice agrupado podem ser armazenados no nível da folha do Índice. 

Índice não agrupado: Os dados reais do índice não agrupado não são encontrados diretamente no nó da folha; em vez disso, ele precisa dar um passo adicional para localizar, porque possui apenas valores de localizadores de linha apontando para dados reais. O índice não agrupado não pode ser classificado como índice clusterizado. Pode haver vários índices não clusterizados por tabela, na verdade, depende da versão do SQL Server que estamos usando. Basicamente, o SQL Server 2005 permite 249 Índices Não Agrupados e, para versões anteriores como 2008, 2016, permite 999 Índices Não Agrupados por tabela.

0
Abhishek Duppati

Deixe-me oferecer uma definição de livro didático sobre "índice de clustering", que é tirada de 15.6.1 de Database Systems: The Complete Book :

Também podemos falar de índices clustering, que são índices em um atributo ou atributos, de modo que todas as tuplas com um valor fixo para a chave de pesquisa desse índice aparecem aproximadamente como poucos blocos que possam contê-las.

Para entender a definição, vamos dar uma olhada no Exemplo 15.10 fornecido pelo livro:

Uma relação R(a,b) que é classificada no atributo a e armazenada naquela ordem , Compactada em blocos, é certamente clusterd. Um índice em a é um índice de clustering , Já que para um determinado a- value a1, todas as tuplas com Esse valor para a são consecutivas. Eles, portanto, aparecem empacotados em blocos , Possivelmente executados para os primeiros e últimos blocos que contêm a- value a1, como sugerido na Figura 15.14. No entanto, um índice em b é Improvável de ser agrupado, já que as tuplas com um valor b- fixo Serão espalhadas por todo o arquivo, a menos que os valores a e b sejam muito estreitamente correlacionada.

Fig 15.14

Observe que a definição não impõe que os blocos de dados tenham que estar contíguos no disco; ele apenas diz que as tuplas com a chave de busca são agrupadas no menor número possível de blocos de dados.

Um conceito relacionado é clustered relation. Uma relação é "agrupada" se suas tuplas forem agrupadas aproximadamente como poucos blocos que possam conter essas tuplas. Em outras palavras, a partir de uma perspectiva de bloco de disco, se contiver tuplas de relações diferentes, então essas relações não podem ser agrupadas (ou seja, há uma maneira mais compacta de armazenar essa relação trocando as tuplas dessa relação de outros blocos de disco tuplas não pertencem à relação no bloco de disco atual). Claramente, R(a,b) no exemplo acima é agrupado. 

Para conectar dois conceitos juntos, uma relação clusterizada pode ter um índice de clustering e índice de não cluster. No entanto, para relação não clusterizada, o índice de cluster não é possível, a menos que o índice seja construído sobre a chave primária da relação.

"Cluster" como um Word é spam em todos os níveis de abstração do lado do armazenamento do banco de dados (três níveis de abstração: tuplas, blocos, arquivos). Um conceito chamado " arquivo em cluster ", que descreve se um arquivo (uma abstração para um grupo de blocos (um ou mais blocos de disco)) contém tuplas de uma relação ou relações diferentes. Não se relaciona ao conceito de índice de clustering como está no nível do arquivo.

No entanto, alguns material de ensino gostam de definir o índice de cluster com base na definição de arquivo em cluster. Esses dois tipos de definições são os mesmos no nível de relação de cluster, independentemente de definirem a relação de cluster em termos de bloco ou arquivo de disco de dados. A partir do link neste parágrafo, 

Um índice no (s) atributo (s) A em um arquivo é um índice de armazenamento em cluster quando: Todas as tuplas com valor de atributo A = a são armazenadas sequencialmente (= consecutivamente) no arquivo de dados

Armazenar as tuplas consecutivamente é o mesmo que dizer "as tuplas são agrupadas em aproximadamente quantos blocos puderem conter essas tuplas" (com pequena diferença em uma falando sobre arquivo, a outra falando em disco). É porque armazenar Tupla consecutivamente é o caminho a ser alcançado "compactado em cerca de poucos blocos que possam conter essas tuplas".

0
xxks-kkk