Eu tenho uma exposição limitada ao DB e usei o DB apenas como programador de aplicativos. Eu quero saber sobre Clustered
e Non clustered indexes
. Pesquisei no Google e o que encontrei foi:
Um índice em cluster é 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 em cluster. Os nós folha de um índice em cluster contêm as páginas de dados. Um índice não clusterizado é um tipo especial de índice no qual a ordem lógica do índice não corresponde à ordem física armazenada das linhas no disco. 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.
O que eu achei no SO foi Quais são as diferenças entre um índice em cluster e um não em cluster? .
Alguém pode explicar isso em inglês simples?
Um índice em cluster significa que você está dizendo ao banco de dados para armazenar valores próximos realmente próximos um do outro no disco. Isso tem o benefício de uma rápida verificação / recuperação de registros que se enquadram em algum intervalo de valores de índice em cluster.
Por exemplo, você tem duas tabelas, Cliente e Pedido:
Se você deseja recuperar rapidamente todos os pedidos de um cliente em particular, convém criar um índice em cluster na coluna "Identificação do Cliente" da tabela Pedido. Dessa forma, os registros com o mesmo Código do Cliente serão fisicamente armazenados próximos um do outro no disco (clusterizado), o que acelera sua recuperação.
PS O índice no CustomerID obviamente não será exclusivo, portanto, é necessário adicionar um segundo campo para "unificar" o índice ou deixar o banco de dados cuidar disso para você, mas isso é outra história.
Em relação a vários índices. Você pode ter apenas um índice em cluster por tabela, pois isso define como os dados são organizados fisicamente. Se você deseja uma analogia, imagine uma sala grande com muitas mesas. Você pode colocar essas tabelas para formar várias linhas ou reuni-las para formar uma grande mesa de conferência, mas não nos dois sentidos ao mesmo tempo. Uma tabela pode ter outros índices; eles apontarão para as entradas no índice clusterizado que, por sua vez, dirão finalmente onde encontrar os dados reais.
fonte
XML
,VARCHAR(MAX)
ouVARBINARY(MAX)
. Observe que geralmente faz sentido agrupar primeiro o campo de data , pois um índice agrupado é mais eficiente para varreduras de intervalo, que são mais comuns em tipos de datas. YMMV.No armazenamento orientado a linhas do SQL Server, os índices clusterizados e não clusterizados são organizados como árvores B.
( Fonte da imagem )
A principal diferença entre índices agrupados e índices não agrupados é que o nível folha do índice agrupado é a tabela. Isso tem duas implicações.
Os índices não agrupados também podem fazer o ponto 1 usando a
INCLUDE
cláusula (Desde o SQL Server 2005) para incluir explicitamente todas as colunas não-chave, mas são representações secundárias e sempre há outra cópia dos dados (a própria tabela).Os dois índices acima serão quase idênticos. Com as páginas de índice de nível superior que contêm valores para as colunas-chave
A,B
e as páginas de nível de folha que contêmA,B,C,D
A citação acima dos manuais online do SQL Server causa muita confusão
Na minha opinião, seria muito melhor redigido como.
A cotação on-line dos livros não está incorreta, mas você deve deixar claro que a "classificação" de índices não agrupados e agrupados não é lógica. Se você ler as páginas no nível da folha seguindo a lista vinculada e ler as linhas na página na ordem da matriz de slots, você lerá as linhas de índice na ordem classificada, mas fisicamente as páginas podem não ser classificadas. A crença comum de que, com um índice em cluster, as linhas sempre são armazenadas fisicamente no disco na mesma ordem em que a chave de índice é falsa.
Isso seria uma implementação absurda. Por exemplo, se uma linha é inserida no meio de uma tabela de 4 GB, o SQL Server não precisa copiar 2 GB de dados no arquivo para liberar espaço para a linha recém-inserida.
Em vez disso, ocorre uma divisão da página. Cada página no nível folha dos índices em cluster e não em cluster tem o endereço (
File:Page
) da página seguinte e anterior em ordem lógica. Essas páginas não precisam ser contíguas ou em ordem de chave.por exemplo, a cadeia de páginas vinculada pode ser
1:2000 <-> 1:157 <-> 1:7053
Quando ocorre uma divisão de página, uma nova página é alocada de qualquer lugar do grupo de arquivos (de uma extensão mista, para tabelas pequenas ou de uma extensão uniforme não vazia pertencente a esse objeto ou de uma extensão uniforme recém-alocada). Pode até não estar no mesmo arquivo se o grupo de arquivos contiver mais de um.
O grau em que a ordem lógica e a contiguidade diferem da versão física idealizada é o grau de fragmentação lógica.
Em um banco de dados recém-criado com um único arquivo, executei o seguinte.
Em seguida, verifique o layout da página com
Os resultados estavam por todo o lado. A primeira linha na ordem das chaves (com o valor 1 - destacada com a seta abaixo) estava quase na última página física.
A fragmentação pode ser reduzida ou removida reconstruindo ou reorganizando um índice para aumentar a correlação entre ordem lógica e ordem física.
Depois de correr
Eu tenho o seguinte
Se a tabela não tiver um índice clusterizado, ela será chamada de heap.
Os índices não clusterizados podem ser criados em um heap ou em um índice clusterizado. Eles sempre contêm um localizador de linhas de volta à tabela base. No caso de um heap, esse é um identificador de linha físico (rid) e consiste em três componentes (Arquivo: Página: Slot). No caso de um índice em cluster, o localizador de linhas é lógico (a chave de índice em cluster).
Para o último caso, se o índice não agrupado já incluir naturalmente as colunas-chave do IC como colunas-chave NCI ou
INCLUDE
-d, nada será adicionado. Caso contrário, as colunas-chave do IC ausentes serão adicionadas silenciosamente ao NCI.O SQL Server sempre garante que as colunas-chave sejam exclusivas para os dois tipos de índice. O mecanismo no qual isso é imposto para índices não declarados como exclusivos difere entre os dois tipos de índice.
Os índices agrupados são
uniquifier
adicionados a todas as linhas com valores-chave que duplicam uma linha existente. Este é apenas um número inteiro ascendente.Para índices não agrupados em cluster não declarados como exclusivos, o SQL Server adiciona silenciosamente o localizador de linhas à chave de índice não agrupado. Isso se aplica a todas as linhas, não apenas àquelas que são realmente duplicadas.
A nomenclatura em cluster vs não em cluster também é usada para índices de armazenamento de colunas. O artigo Aprimoramentos nos armazenamentos de colunas do SQL Server declara
fonte
SQL Server 2014
. Eu recebo a95%
fragmentação do índice após a inserção inicial. Apósindex rebuild
a fragmentação foi0%
e os valores foram ordenados. Eu estou pensando, podemos dizer issoThe only time the data rows in a table are stored in sorted order is when its clustered index fragmentation is 0
?Sei que essa é uma pergunta 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 Sistema Decimal de Dewey, ou DDS). Isso corresponde ao "índice agrupado" dos livros. Se o número do DDS do livro que você deseja fosse
005.7565 F736s
, você começaria localizando a linha de estantes rotuladas001-099
ou algo parecido. (Esse sinal de endcap no final da pilha corresponde a um "nó intermediário" no índice.) Eventualmente, você pesquisaria detalhadamente a prateleira específica rotulada005.7450 - 005.7600
e pesquisaria até encontrar o livro com o número de DDS especificado e em Nesse ponto, você encontrou seu livro.ÍNDICE NÃO CLUSTRADO
Mas se você não entrou na biblioteca com o número DDS do seu livro memorizado, precisaria de um segundo índice para ajudá-lo. Antigamente, você encontrava na frente da biblioteca um maravilhoso escritório de gavetas conhecido como "Catálogo de Cartas". Nele havia milhares de cartões 3x5 - um para cada livro, classificados em ordem alfabética (talvez por título). 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 fosse rotulada com o intervalo de cartões que ele continha (
Ka - Kl
por exemplo; o "nó intermediário"). Mais uma vez, você pesquisaria até encontrar seu livro, mas, nesse caso, depois de encontrá-lo (ou seja, o "nó da folha"), você não terá o livro em si,número de índice (o número do DDS) com o qual você pode encontrar o livro real no índice em cluster.Obviamente, 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. (Normalmente, havia pelo menos dois desses catálogos: um classificado pelo nome do autor e um pelo título.) Em princípio, você pode ter quantos desses índices "não agrupados em cluster" desejar.
fonte
Abaixo, algumas características dos índices agrupados e não agrupados:
Índices agrupados
create Index index_name(col1, col2, col.....)
.Índices não agrupados
fonte
Uma regra prática não-técnica muito simples seria que os índices agrupados são geralmente 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, por padrão, criará um índice clusterizado em suas colunas de chave primária. Como você aprendeu, o índice de cluster se relaciona à maneira como os dados são classificados fisicamente no disco, o que significa que é uma boa opção geral para a maioria das situações.
fonte
Índice agrupado
Um índice clusterizado determina a ordem física de DATA em uma tabela.Por esse motivo, uma tabela possui apenas 1 índice clusterizado.
" dicionário " Não há necessidade de nenhum outro índice, já é o índice de acordo com as 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 único local. O índice está armazenando em outro local e o índice possui ponteiros para o local de armazenamento dos dados.Por esse motivo, uma tabela possui mais de 1 índice não clusterizado.
fonte
Índice agrupado
Os índices agrupados classificam e armazenam as linhas de dados na tabela ou exibição com base em seus valores-chave. Estas 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 classificadas 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 do í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.
Você pode adicionar colunas não chave ao nível da folha do índice não clusterizado para ignorar os limites existentes da chave de índice e executar consultas totalmente cobertas, indexadas. Para mais informações, consulte Criar índices com colunas incluídas. Para obter detalhes sobre os limites da 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-descript
fonte
Deixe-me oferecer uma definição de livro didático sobre "índice de clustering", extraída da 15.6.1 de Sistemas de banco de dados: o livro completo :
Para entender a definição, vamos dar uma olhada no Exemplo 15.10 fornecido pelo livro:
Observe que a definição não impõe que os blocos de dados tenham que ser contíguos no disco; diz apenas que as tuplas com a chave de pesquisa são compactadas no menor número possível de blocos de dados.
Um conceito relacionado é uma relação em cluster . Uma relação é "agrupada" se suas tuplas forem agrupadas em tão poucos blocos quanto possível. Em outras palavras, da perspectiva de um bloco de disco, se ele contém tuplas de relações diferentes, essas relações não podem ser agrupadas (ou seja, existe uma maneira mais compacta de armazenar essa relação, trocando as tuplas dessa relação de outros blocos de disco com o tuplas não pertencem à relação no bloco de disco atual). Claramente,
R(a,b)
no exemplo acima, está agrupado.Para conectar dois conceitos, uma relação em cluster pode ter um índice de cluster e um índice sem cluster. No entanto, para relações sem cluster, 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 uma palavra é spam em todos os níveis de abstração do lado de armazenamento do banco de dados (três níveis de abstração: tuplas, blocos, arquivo). 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 está relacionado ao conceito de índice de cluster, pois está no nível do arquivo.
No entanto, alguns materiais de ensino gostam de definir o índice de clustering com base na definição do arquivo em cluster. Esses dois tipos de definições são os mesmos no nível de relação em cluster, independentemente de eles definirem relação em cluster em termos de bloco ou arquivo de disco de dados. No link deste parágrafo,
Armazenar tuplas consecutivamente é o mesmo que dizer "tuplas são agrupadas em tão poucos blocos quanto possível para conter essas tuplas" (com uma pequena diferença em um falando sobre arquivo e o outro sobre disco). É porque armazenar tuplas consecutivamente é o caminho para atingir "empacotado aproximadamente o menor número possível de blocos que possam conter essas tuplas".
fonte
Índice agrupado: a restrição de chave primária cria o índice agrupado automaticamente se ainda não existir um índice agrupado na tabela. Os dados reais do índice clusterizado podem ser armazenados no nível da folha do Índice.
Índice não clusterizado : os dados reais do índice não clusterizado não são encontrados diretamente no nó folha, mas precisam ser executados uma etapa adicional para encontrar, pois possuem apenas valores de localizadores de linhas apontando para dados reais. O índice não agrupado não pode ser classificado como índice agrupado. Pode haver vários índices não agrupados por tabela, na verdade isso depende da versão do servidor sql que estamos usando. Basicamente, o Sql server 2005 permite 249 índices não clusterizados e para versões acima como 2008, 2016, permite 999 índices não clusterizados por tabela.
fonte
Índice em cluster - Um índice em cluster define a ordem em que os dados são fisicamente armazenados em uma tabela. Os dados da tabela podem ser classificados apenas de maneira, portanto, pode haver apenas um índice em cluster por tabela. No SQL Server, a restrição de chave primária cria automaticamente um índice em cluster nessa coluna específica.
Índice não clusterizado- Um índice não clusterizado não classifica os dados físicos dentro da tabela. De fato, um índice não clusterizado é armazenado em um local e os dados da tabela são armazenados em outro local. É semelhante a um livro em que o conteúdo do livro está localizado em um local e o índice em outro. Isso permite mais de um índice não agrupado por tabela. É importante mencionar aqui que dentro da tabela os dados serão classificados por um índice agrupado. No entanto, dentro do índice não agrupado, os dados são armazenados na ordem especificada. O índice contém valores de coluna nos quais o índice é criado e o endereço do registro ao qual o valor da coluna pertence.Quando uma consulta é emitida em uma coluna na qual o índice é criado, o banco de dados primeiro acessa o índice e procura por o endereço da linha correspondente na tabela. Ele irá para o endereço da linha e buscará outros valores da coluna. É devido a essa etapa adicional que os índices não agrupados em cluster são mais lentos que os índices agrupados
Diferenças entre índice agrupado e não agrupado
Para mais informações, consulte este artigo.
fonte