Heap tables in SQL Server

In the last post of this blog series, I discussed what a B-Tree index was and briefly explained its history.

Antes de mergulhar nos índices que o servidor SQL usa, é importante definir a fundação das estruturas de dados. A tabela mais básica que você pode criar é um monte. Um heap é uma estrutura não Triada de páginas que não estão ligadas entre si.

quando deve utilizar heaps?

a recomendação de melhores práticas é evitar heaps de servidor SQL, na maioria dos casos. Kimberly Tripp explica algumas das razões e debate aqui, mas eu vou cobrir o alto nível. Heaps, sendo a estrutura de armazenamento mais básica, está faltando recursos que melhoram o desempenho para cargas de trabalho normais (OLTP). Alguns argumentam que os cabeçalhos são melhores para as operações de extração, transformação e carregamento (ETL), porque há menos páginas para manter durante as operações de escrita (UPDATE/INSERT/DELETE). Especificamente, os cabeçalhos podem ser mais rápidos do que um índice B-tree se as parcelas de página ocorrerem e muitos níveis do índice devem ser atualizados. Além disso, o identificador de linha (RID), discutido mais abaixo, é apenas 8 bytes. Isto pode funcionar melhor do que um índice agrupado com um monte de colunas-chave porque os índices Não agrupados devem armazenar a chave agrupada ou RID para cada linha indexada. Normalmente eu recomendo usar um índice agrupado (mais em índices agrupados enquanto continuamos esta série) em vez de um monte, mas, se você usá-los, usá-los apenas quando você tiver provado que eles serão mais eficientes do que um índice agrupado. Depois de discutir a estrutura de um heap, vou delinear as preocupações de desempenho de usar heaps.

Heap structure

a heap is a groups of unsorted pages which are not linked. Anatomia de página está fora de escopo para esta série, uma vez que todos os tipos de tabelas indexadas e não indexadas usam a mesma estrutura de página, mas eu encorajo você a verificar aqui e aqui para aprender mais.

um heap é composto por uma ou mais páginas de alocação de índice (IAM) que apontam para as páginas de dados que compõem o heap. A única exceção a isso é quando você tem uma linha que foi atualizada e não poderia caber mais em sua página. Nesse caso, você obtém um ponteiro de encaminhamento para a linha que foi movida para uma página existente com espaço ou uma nova página. É possível para você produzir uma cadeia de registros de encaminhamento se a linha continua a precisar de realocação por outras operações.

heap-structure-1

Image reference: MSDN

a heap has one row in sys.as partições por partição e o seu index_ ID serão iguais a zero. Neste registro, a primeira página indica a primeira das páginas do mapa de alocação de índice (IAM). Uma página do IAM mapeia páginas para cada unidade de alocação e gerencia 4 GB pedaços da tabela. As unidades de atribuição incluem::

  1. in_row_data allocation unit
  2. LOB_DATA allocation unit
  3. ROW_OVERFLOW_DATA allocation unit

a página do IAM contém o cabeçalho padrão de 96 bytes seguido pelo cabeçalho do IAM. O cabeçalho do IAM começa com oito slots para atribuição de extensão mista e, em seguida, um bit-map de 8000 bytes para localizar extents uniformes alocados à tabela.

uma extensão mista é uma que contém páginas de mais de um quadro. Isto também é referido como uma extensão compartilhada. O objetivo de uma extensão mista é economizar espaço com tabelas que são menores que 64 KB. Uma extensão uniforme é aquela em que todas as páginas da extensão pertencem a esse quadro único.

mixed-extent

referência da imagem: a extensão

para investigar a nossa página do IAM, primeiro devemos localizá-la.

DBCC IND (‘demo’, ‘ dbo.demonstração’,1)

dbcc-ind

com o DBCC IND, temos 17 páginas de dados e uma página IAM. As páginas do IAM não são auto-referenciadas, portanto o IAMFID (ID de arquivo do IAM) e o IAMPID (Id de página do IAM) são nulos. Isto significa que a nossa página do IAM está no ID do ficheiro (PageFID) 1 e é o Id da página (PagePID) 297. A página DBCC nos permitirá ver a nossa página IAM.

DBCC TRACEON(3604);

DBCC PAGE (‘demo’,1,297,3);

dbcc-page-iam

Em AMARELO, há oito alocações de página única na nossa extensão mista. Em Laranja as extensões uniformes são exibidas em intervalos.

implicações de desempenho

executar várias operações de linguagem de manipulação de dados (DML) em um heap tem estes efeitos.

  • inserir-novas linhas podem ser colocadas na primeira página disponível com espaço suficiente. Assim, sempre que uma nova linha é inserida, ela provavelmente será adicionada à última página.
  • UPDATE – Linhas podem permanecer na mesma página se ele se encaixa na página após a atualização, se não ele será removido da página atual e colocou na primeira página disponível com espaço suficiente e de um encaminhamento ponteiro está escrito em sua página original.
  • DELETE – os dados não são substituídos, o espaço é apenas sinalizado como disponível para reutilização. Isto pode fazer com que a sua mesa consuma significativamente mais espaço em disco do que é necessário.
  • selecione-uma varredura de tabela em toda a tabela terá de ser lida para a maioria das consultas. A exceção a isso é quando há um índice adequado não agrupado disponível. Discutiremos os índices Não agrupados mais tarde nesta série.

lê-se

sem qualquer índice de suporte, um heap requer uma varredura de tabela completa para qualquer consulta. Isto é porque a estrutura física não está ordenada e não há nenhuma ligação de página para suportar varreduras de alcance.

SET STATISTICS IO ON

DBCC IND (‘demo’, ‘ dbo.demonstração’,1)

seleccionar a contagem (*)
de dbo.demo

repetir o nosso comando DBCC IND de cima lembra-nos que temos 18 páginas para esta tabela. 17 páginas de dados e 1 página IAM.

–os resultados DBCC IND removidos porque já está mostrado acima.
-18 resultado da linha, indica 18 páginas.

(18 linhas afectadas)
execução DBCC concluída. Se o DBCC imprimiu mensagens de erro, contacte o seu administrador de Sistema.

número de linhas
—-
5031
(1 Linha (s) afectada (s))

tabela “Demo”. Contagem de Scan 1, leitura lógica 17, leitura física 0, leitura em frente 0, leitura lógica lob 0, leitura física lob 0, leitura lob em frente 0.
(1 Linha(s) afectada)

Note as 17 leituras lógicas da nossa consulta. Isto é porque a página do IAM não é contada na métrica de leitura lógica e nós realizamos uma varredura completa da tabela com 18 páginas.

Writes and forward pointers

As mentioned above, INSERTs and DELETEs are fairly straight forward. Uma inserção ocorre na primeira página com espaço disponível, mesmo que isso signifique a criação de uma nova página. Os apagamentos são realizados por Des-alocação do espaço que a linha estava ocupando.

atualizações são onde as coisas vão para baixo para Montes. Quando um tipo de dados de comprimento fixo é atualizado, a atualização ocorrerá no local. Se um tipo de dados de comprimento variável é atualizado e o comprimento aumentou, há uma chance de que a linha não vai mais caber na mesma página. Quando a linha já não se encaixa, um ponteiro de encaminhamento é colocado no espaço onde a linha original foi e a linha é realocada para uma nova página. Este processo tem um impacto negativo no desempenho da leitura. Vamos demonstrar.

Originally all of our records in the dbo.a tabela demo continha VARCHARs com 9 caracteres.

selecione o TOP 5 *
da dbo.demo

demonstração dados da tabela

Para criar alguns ponteiros para a frente, vamos atualizar todas as nossas linhas e aumentar o comprimento da varLen coluna.

update dbo.demo
set varLen = replicate(‘a’,100)

agora temos 95 páginas em nossa pilha porque todas as nossas linhas foram realocadas para novas páginas com ponteiros dianteiros deixados para trás.

DBCC IND (‘demo’, ‘ dbo.demonstração’,1)

dbcc-output-1

como você pode imaginar, com montes que requerem varreduras completas da tabela, Nós precisaremos ler muito mais páginas para a mesma quantidade de registros agora.

SET STATISTICS IO ON

SELECT COUNT(*)
FROM dbo.demo
(1 Linha (s) afectada)

tabela “Demo”. Contagem de Scan 1, leitura lógica 4405, leitura física 0, leitura antecipada 0, leitura lógica lob 0, leitura física lob 0, leitura lob 0, leitura lob 0.

nossas leituras aumentaram drasticamente porque as páginas originais tiveram que ser lidas e então os ponteiros dianteiros tiveram que ser seguidos. O impacto de desempenho e desperdício de espaço na memória e no disco é por isso que precisamos de índices agrupados.

da próxima vez

a estrutura de dados heap não é um índice e é frequentemente a estrutura de dados de pior desempenho para as suas tabelas no servidor SQL. Abordámo-la hoje como uma base de entendimento que será útil ao discutirmos os índices. Na próxima parte desta série, serão cobertos os índices agrupados, uma estrutura B+-árvore para os dados da tabela.

Deixe uma resposta

O seu endereço de email não será publicado.