DBCC IND

Esse é mais um artigo da série “Saga da otimização com comandos antigos”

No último artigo, apresentei um problema muito comum nas estruturas HEAPS para armazenamento de dados. Agora vamos falar da equivalência:

Table scan = Heap scan = Allocation ordered scan = IAM scan

Você sabe o que isso significa? Vamos começar explicando o conceito central, que é a Heap.

Heap

Heap é uma estrutura de dados composta apenas por um conjunto de página de dados. Encontramos várias referências nas quais Heap é sinônimo de Tabela, por isso, é comum dizer que:

Table scan = Heap scan

Isso faz sentido, pois muitas vezes a Tabela corresponde aos dados na forma lógica:

image

Enquanto que a Heap representa o conjunto de páginas que armazenam os dados, ou seja, seria a forma física:

image

 

Index Allocation Map (IAM)

Além das páginas de dados, existe uma página (ou mais páginas quando a tabela é grande) denominada de Index Allocation Map (IAM).

Também é comum ouvir que:

Heap scan = Allocation ordered scan = IAM scan

O conceito é simples! Fica mais fácil de entender com a ajuda do comando DBCC IND.

DBCC IND(dbid, table, 0)

image

FID = File_ID
PID = Page_ID

Aqui observamos a tabela é composta pelas páginas: 329, 537-543, 360-363, sendo que todas pertencem ao arquivo (FID) 1. Também observamos que o IAM corresponde à página 1:329 (FILE_ID=1, PAGE_ID=329) e ele contém o ponteiro para todas as páginas. Ela seria o mapeamento de todas as páginas que pertencem a um determinado objeto.

image

Podemos dizer que uma estrutura de alocação é composta por uma ou mais páginas IAM. Isso ocorre porque o IAM possui apenas 8Kb de tamanho e nem sempre consegue armazenar todos os ponteiros necessários. Portanto, um Allocation Unit é igual a um conjunto de IAM.

IAM Scan

Como disse no começo do artigo, temos a equivalência:

Table scan = Heap scan = Allocation ordered scan = IAM scan

Que poderia ser quebrada em partes:

Table e Heap

Tabela é uma entidade lógica composta pelos DADOS e METADADOS. No desenho anterior, a primeira linha da tabela corresponde ao cabeçalho, que corresponde ao nome das colunas. Esse é o metadado, que descreve as colunas e os tipos de dado. Os dados brutos são armazenados em uma estrutura de dados, que no caso é a Heap. Nem sempre os dados ficam em uma Heap. Poderia ser uma estrutura do tipo BTree+ ou os dados ficam distribuídos entre várias estruturas Heaps/BTrees (ex: Particionamento).

Heap e Allocation Unit

Allocation Unit é um espaço de alocação no disco. Heap pode utilizar 3 Allocation Units ao mesmo tempo: In-Row, Row Overflow, LOB. Quando falamos em um Heap scan, estamos falando de uma operação de Scan em um Allocation Unit corresponde ao In-Row.

Allocation Unit e IAM

Allocation Unit corresponde ao conjunto de IAM. IAM é uma página de 8Kb com ponteiros para Extents, estando diretamente relacionado com os arquivos em disco. IAM possui ponteiros entre outros IAM (lista duplamente ligada). Por outro lado, Allocation Unit corresponde a uma estrutura que ajuda o banco de dados a alocar espaço em disco sem se preocupar com os detalhes dos arquivos.

No fim concluímos que: Table, Heap, Allocation Unit e IAM são conceitos bem diferentes.

Então por que dizer que existe uma equivalência entre as operações de scan? Não sei exatamente o motivo, mas muita gente usa essas expressões livremente. O importante é deixar claro que o IAM scan é a operação mais rápida de Table Scan presente no SQL Server. IAM scan aumenta a chance de realizar operações de read-ahead usando um mecanismo chamado de “read-scatter”, que procura agregar as operações de leituras sequenciais próximas.

No próximo artigo, vamos ver a estrutura de BTree e introduzir um conceito chamado de Index Scan. Será que esse mecanismo é mais rápido que o Heap scan?