Um banco dados é composto por alguns objetos, e neste primeiro post da série, vamos abordar o item “tabela”.
Este nada mais é que um armazenamento lógico dos dados. Uma tabela também pode ser referida como “Objeto de alocação de dados”, que representa um armazenamento físico do dados em disco, em arquivos de dados do SQL Server, onde os arquivos estão associados ao banco de dados.
Para cada arquivo de dados, eu tenho um local definido para o armazenamento das informações, que está no formato de “Registro de dados”.
Este “local” é conhecido com “Página de dados”
O que é uma página de dados?
Uma página de dados é a menor alocação de dados utilizada pelo SQL Server. Cada página de dados tem um tamanho definido em 8192 bytes.
* Este detalhe do tamanho é importante para compreendermos como armazenar o maior número de dados possível em uma página de dados.
Uma página de dados, é exclusiva de um objeto de alocação, e um objecto de alocação pode ter diversas páginas de dados.
Que estão divididos entre cabeçalho, área de dados e slot de controle. Como a imagem abaixo
Cabeçalho: Este é responsavel por armazenar metadados de 96 bytes.
* Owner Id: ID do objeto do proprietário de alocação de dados
* Page Type: Tipo da página, existem diferentes tipos de páginas, como dados, índice, imagem, etc. Mas vamos deixar simples, por enquanto esse detalhe. Vou abordar isso em um post especifico.
* Page Number: Número da página.
Área de dados: Este local é onde fica armazenado os dados, com um espaço de 8060 bytes, ou seja, a página perde alguns bytes para o cabeçalho e Slot de controle.
Slot de controle: Este é responsável por armazenar ponteiros, assim é possível saber qual é a próxima página de dados. Ocupando 36 bytes.
Vamos testar os limites de páginas de dados, executando o comando T-SQL abaixo:
CREATE TABLE Test ( Descricao1 CHAR(4096), Descricao2 CHAR(4000) );
No comando acima, estamos tentando criar uma tabela com 2 colunas, porem este comando não irá executar corretamente, iremos receber algo como:
“Msg 1701, Level 16, State 1, Line 1
Creating or altering table ‘Test’ failed because the minimum row size would be 8103, including 7 bytes of internal overhead. This exceeds the
maximum allowable table row size of 8060 bytes.”
Acima temos uma mensagem de erro dizendo que excedemos o limte de 8060 bytes da página, porque o SQL Server não conseguirá armazenar um registro de dados acima de 8060 bytes.
Vamos a outro exemplo, para verificar os espaço dos dados armazenados.
CREATE TABLE Test( Descricao1 CHAR(4000), Descricao2 CHAR(4000) ); GO INSERT INTO Test (Descricao1, Descricao2) VALUES ('Descrição de teste 1', 'Descrição de teste 2'); GO sp_spaceused 'Test'
Ao executarmos o comando T-SQL acima devemos ter o seguinte resultado:
Podemos perceber pelo resultado, que temos uma linha armazenada, com apenas uma página de dados e 8 KB.
Se executarmos novamente o comando INSERT, vamos ver que os valores utilizados irão dobra:
INSERT INTO Test (Descricao1, Descricao2) VALUES ('Descrição de teste 1', 'Descrição de teste 2'); GO sp_spaceused 'Test'
Lembrando que o tipo de dados “CHAR”, ocupa todo o espaço especificado, mesmo que a frase “Descrição de teste 1” não ocupe todos os espaço, para o armazenamento na página isso irá ocorrer.
O que é um Extend?
É apenas um agrupamento lógico de páginas de dados. Ele é útil para gerenciar de forma mais eficaz o espaço alocado. Um extend tem 64 Kbytes, agrupando 8 páginas de dados.
* Um detalhe importante, quando um disco é formatado temos a opção de escolher o tamanho do cluster, o ideal é escolher 64 KB, em um cenário que envolva banco dados SQL Server. Isso irá implicar no número de leituras de disco.
No Extend ainda, temos 2 tipos: Mixed Extend e Uniform Extend.
* Mixed Extend: Este tipo é quando as páginas de dados são para objetos de alocações de diferentes, ou seja, ele contem páginas de dados da tabela1, tabela2, etc.
* Uniform Extend: Este é para páginas de dados de um único objeto de alocação de dados.
Qual a diferença?
O SQL Server não sabe quanto espaço será ocupado, ele entende que as tabelas terão tamanhos pequenos. Assim é possivel ter o conteúdo de uma tabela, em uma página de dados. As informações de espaço livre são compactadas, portanto, poucas páginas contêm essas informações.
Isso aumenta a velocidade, reduzindo a quantidade de leituras de disco necessárias para recuperar informações. Isso também aumenta a chance de que as páginas de alocação permaneçam na memória e não precisem de mais leituras.
Uma nova tabela é alocada em um “Mixed Extend” utilizando uma página de dados. Caso a tabela precise de uma nova página de dados e o Extend possua páginas não utilizadas, o SQL Server continua a alocar os dados no “Mixed Extend”. Em uma outra situação, em que o SQL Server precise de uma nova página de dados no “Mixed Extend”, onde ele não tem mais disponível (dentre as 8 disponíveis) o SQL Server irá alocar um “Extend Uniform”, e a partir daí ele segue como “Midex Uniform”.
Este post é apenas uma introdução para tuning em SQL Server, temos que introduzir um conceito para que seja possível entendermos todo o conjunto.
Espero ter ajudado!
Até a próxima!
Eae, perdi seu contato, mas achei seu email revirando minhas mensagens antigas e ainda bem que você esse username pra tudo, ai cai no blog haha
Se quiser trocar uma ideia um dia desses ai, acho que temos bastante novidades.
Bora marcar uma cervejada
Manda um DM no FB ai. flw vlw
abraços
Ah, vc pode me achar por “vandersondev”, uso isso em quase todas minhas contas.