DBCC IND
Esse é mais um artigo da série “Saga da otimização com comandos antigos”
- Parte 1: SET STATISTICS IO
- Parte 2: DBCC DROPCLEANBUFFERS
- Parte 3: DBCC SHOWCONTIG
- Parte 4: DBCC PAGE
- Parte 5: sp_spaceused
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:
Enquanto que a Heap representa o conjunto de páginas que armazenam os dados, ou seja, seria a forma física:
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)
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.
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?