SQL Passo-a-Passo – Passo 3 (Índices)

Existem 3 modos de acessar os dados no SQL Server 2008:

  • Heap
  • Índices “Clustered
  • Índices “Non-Clustered

Um pouco da estrutura do SQL Server 2008

Para entender como os dados são acessados no SQL Server 2008, vamos primeiro analisar como eles são armazenados.
O SQL Server 2008 utiliza um ou mais arquivos que contêm - numa área reservada (IAM) -informações de controle sobre o que está armazenado naquele arquivo: tabelas, índices, stored procedures, etc (arquivos com extensão .mdf).

A informação é armazenada em páginas de 8 KB, e estas informações de controle indicam quais páginas pertencem a cada tabela ou índice.

O que é um “Heap”?

Um Heap é uma tabela que contém uma ou mais páginas, com informações armazendas sem seguir nenhuma ordem pré-determinada. Para fazer um paralelo, é como um quarto de adolescente: onde as coisas forem colocadas, elas ficam (sem nenhuma ordem) J

Uma vez que não há ordenação, para localizar uma informação em um Heap é necessário realizar sempre um “table scan”.

SQL Server - Indices - Heap 
Acesso aos dados em um Heap

O que é um índice “Clustered”?

Quando criamos um índice “Clustered”, os registros da tabela passam a ser ordenados de acordo com o(s) campo(s) do índice. Isso significa que os registros são re-arranjados, fisicamente, nas páginas de dados, permitindo a busca por métodos de “bissecção” conforme comentado no post anterior (Passo 2).

O índice contém os valores “inicial” e “final” de cada página, assim quando buscamos um dado, o índice é lido para determinar em qual página o registro buscado se encontra. Depois, é feito um “page scan” para encontrar o registro. Como a página é de 8 KB, o “page scan” é muito rápido.

SQL Server - Indices - Clustered
Acesso aos dados utilizando índice “Clustered”

O que é um índice “Non-Clustered”?

Uma vez que só é possível ordenar fisicamente uma tabela de acordo com um índice (Clustered), se quisermos criar índices baseados em outros campos, teremos que lidar com uma tabela não ordenada (ao menos, não por aqueles campos).

Neste caso, um índice “Non-Clustered” precisa ser criado, e o índice passa a conter não somente os valores do campo, mas também uma referência para a página de dados e a posição dos registros.

A busca por bissecção (árvore binária) é realizada no índice, e uma vez localizado o campo buscado no índice, o registro é recuperado através da referência para a página de dados (8 KB) e a posição do registro.

SQL Server - Indices - Non-Clustered
Acesso aos dados utilizando índice “Non-Clustered”

Créditos: Fica aqui um muito obrigado ao André Hass, que além de conhecer muito de SQL e ter uma paciência de Jó para conversar sobre “SQL Internals”, é um cara super “do bem”! ;)