Home > Performance > Conhecendo Indices Step-by-Step II

Conhecendo Indices Step-by-Step II

Nesta segunda parte do nosso artigo post iremos entender como o SQL Server armazena e lê os dados através de Clustered Indexes, NonClustered Indexes e  Heaps. O objetivo deste post é mostrar conceitualmente como o SQL Server armazena os dados e de como os indices funcionam dentro do SQL Server. Esse post é dedicado ao Luciano [LUTI] Caixeta Moreira, pois, ele é uma das minhas maiores inspirações, após, eu ter realizado o treinamento de SQL Server Internals.

Clustered Tables:

Clustered Tables são conhecidas assim, quando possuem um clustered index. Os dados são armazenados ordenados fisicamente baseando-se na chave do índice, por exemplo. A tabela clientes possui um clustered index sobre a coluna Id, que dizer que os índices são armazenados na ordem dos valores ID. Esses valores podem estar em ordem crescente ou decrescente, iremos ver essa opção na criação do índice mais tarde neste artigo. Como falado anteriormente, existe uma “lista” duplamente ligada entre cada página do índice e a navegação entre os níveis são feitos através de um valor chave. Só pode existir um clustered index por tabela, a pergunta é: Por quê ? Simples! Os dados são armazenados ordenados fisicamente baseando-se na chave do índice. Pra deixar mais claro, vamos a um exemplo completamente BOBO, mas, que pode ajudar na compreensão. Voltando ao tempo de escola quando a “TIA” pedia para que fizéssemos uma fila por ordem de tamanho, neste momento estávamos realizando uma “ordenação física” a um critério que neste caso é o tamanho. Sei que o exemplo parece meio estúpido, mas, esse é um dos motivos pelo qual podemos criar apenas um clustered index por tabela. No caso da professora, ela só pode optar por uma ordem física da fila. Cada clustered index tem uma linha na sys.partitions com o index_id = 1. Abaixo temos a estrutura B-tree do clustered index :

Heaps

Uma heap é uma tabela SEM um clustered index, os dados não são armazenados em uma ordem particular ou obedecem a uma sequencia em particular. Cada heap tem uma linha na sys.partitions com o index_id = 0. Tratando-se de questão de múltiplas partições em uma heap, pode ser aplicado o mesmo conceito que o clustered index . O que difere o clustered index para uma heap é de como o SQL Server realiza a navegação entre as páginas de dados. As páginas de dados não estão ligada em uma lista duplamente ligada com o clustered index então o SQL Server usa uma página IAM (Index Allocation Map) para navegar entre as páginas de uma heap. Na figura abaixo temos a estrutura de uma heap:

Indices NonClustereds:

Índices nonclustered tem a mesma estrutura de uma B-Tree como a de um clustered index. Exceto por as seguintes diferenças:

  • As linhas subjacentes da tabela não são ordenadas e armazenadas baseadas na ordem de suas chaves nonclustereds.
  • O nível folha de um nonclustered índice é feito de páginas de índices ao invés de páginas de dados.

Os índices nonclustereds, podem ser criados em tabelas, views ou em heaps. Basicamente os tipos de índices que existem no SQL Server são: clustereds, Xml índices, Spacial índices e nonclustered indexes (podendo ter variações como: Filtereds, Covereds, Computados e Hash Indexs, que serão cobertos em outros posts). Cada linha de um nonclustered index contém um valor de chave nonclustered (nonclustered key value) e um indicador de linha (row locator). Esse indicador de linha é usado como um ponteiro em um clustered index ou em uma heap. As condições para os dois casos são:

  • Se a tabela é uma Heap, significa ela não tem um clustered index, o localizador é um ponteiro para a linha que é chamado de RID (FileID, PageID e SlotId)
  • Se a tabela tem um clustered index ou o index existe em uma view indexada, o localizador é o que chamamos de chave de clustered index (clustered index key). Pra simplificar é o seguinte, cada nonclustered index dentro de uma tabela clusterizada tem uma referência para um índice clustered.

Índices nonclustereds também podem ser encontrados como as heaps e os clustereds indexes dentro da sys.partitions com o index_id > 1.

Espero ter ajudado!

[] Thiago Carlos [TC] de Alencar

 

 

  1. No comments yet.
  1. March 22, 2012 at 2:54 pm

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: