Implementação da compactação de linha
Este tópico resume como o Mecanismo de Banco de Dados implementa a compactação de linha. Este resumo fornece informações básicas para ajudar no planejamento do espaço de armazenamento exigido pelos dados.
A habilitação da compactação altera somente o formato de armazenamento físico dos dados associados a um tipo de dados, mas não sua sintaxe ou semântica. Não são exigidas alterações de aplicativo quando uma ou mais tabelas são habilitadas para compactação. O novo formato de armazenamento de registros apresenta estas alterações principais:
Reduz a sobrecarga de metadados associados ao registro. Esses metadados são informações sobre colunas, seus comprimentos e deslocamentos. Em alguns casos, a sobrecarga de metadados pode ser maior do que o formato de armazenamento antigo.
Usa o formato de armazenamento de comprimento variável para tipos numéricos (por exemplo, integer, decimal e float) e os tipos baseados em números (por exemplo, datetime e money).
Armazena cadeias de caracteres fixas usando o formato de comprimento variável ao não armazenar caracteres em branco.
Observação |
---|
Valores NULL e 0 de todos os tipos de dados são otimizados e não ocupam bytes. |
Como a compactação de linha afeta o armazenamento
A tabela a seguir descreve como a compactação de linha afeta os tipos existentes no SQL Server. A tabela não inclui o aumento que pode ser gerado usando a compactação de página.
Tipo de dados |
O armazenamento é afetado? |
Descrição |
---|---|---|
tinyint |
Não |
1 byte é o armazenamento mínimo necessário. |
smallint |
Sim |
Se o valor couber em 1 byte, apenas 1 byte será usado. |
int |
Sim |
Usa apenas os bytes necessários. Por exemplo, se um valor puder ser armazenado em 1 byte, o armazenamento ocupará apenas 1 byte. |
bigint |
Sim |
Usa apenas os bytes necessários. Por exemplo, se um valor puder ser armazenado em 1 byte, o armazenamento ocupará apenas 1 byte. |
decimal |
Sim |
Esse armazenamento é exatamente igual ao do formato de armazenamento vardecimal. |
numeric |
Sim |
Esse armazenamento é exatamente igual ao do formato de armazenamento vardecimal. |
bit |
Sim |
A sobrecarga dos metadados atinge 4 bits. |
smallmoney |
Sim |
Usa a representação de dados de número inteiro usando um número inteiro de 4 bytes. Os valores monetários são multiplicados por 10000 e o valor inteiro resultante é armazenado removendo os dígitos após a casa decimal. Esse tipo tem uma otimização de armazenamento semelhante à empregada para tipos de número inteiro. |
money |
Sim |
Usa a representação de dados de número inteiro usando um número inteiro de 8 bytes. Os valores monetários são multiplicados por 10000 e o valor inteiro resultante é armazenado removendo os dígitos após a casa decimal. Esse tipo tem um intervalo maior que smallmoney. Esse tipo tem uma otimização de armazenamento semelhante à empregada para tipos de número inteiro. |
float |
Sim |
Bytes menos significantes com zeros não são armazenados. A compactação float é aplicável principalmente a valores não fracionários em mantissa. |
real |
Sim |
Bytes menos significantes com zeros não são armazenados. A compactação real é aplicável principalmente a valores não fracionários em mantissa. |
smalldatetime |
Não |
Usa a representação de dados de número inteiro usando números inteiros de 2 bytes. A data ocupa 2 bytes. É o número de dias desde 1/1/1901. São necessários 2 bytes a partir de 1902. Portanto, não há aumento a partir desse ponto. A hora é o número de minutos a partir da meia-noite. Os valores de hora logo após 4h começam a usar o segundo byte. Se um smalldatetime for usado apenas para representar uma data (o caso comum), a hora será 0.0. A compactação salva 2 bytes armazenando a hora em um formato de byte mais significativo para compactação de linha. |
datetime |
Sim |
Usa a representação de dados de número inteiro usando números inteiros de 4 bytes. O valor de inteiro representa o número de dias com data base de 1/1/1900. Os primeiros 2 bytes podem representar até o ano 2079. A compactação sempre pode salvar 2 bytes aqui até esse ponto. Cada valor de inteiro representa 3,33 milissegundos. A compactação esvazia os primeiros 2 bytes nos primeiros cinco minutos e precisa do quarto byte após às 16h. Portanto, a compactação pode salvar apenas 1 byte depois das 16h. Quando datetime é compactado como qualquer outro inteiro, a compactação salva 2 bytes na data. |
date |
Não |
Usa a representação de dados de inteiro usando 3 bytes. Representa a data a partir de 1/1/0001. Para datas contemporâneas, a compactação de linha usa todos os 3 bytes. Não gera nenhum aumento. |
time |
Não |
Usa a representação de dados de inteiro usando de 3 a 6 bytes. Há várias precisões que começam com 0 a 9 que podem ocupar de 3 a 6 bytes. O espaço compactado é usado como segue:
Não há nenhuma alteração no armazenamento para compactação de linha. De modo geral, não se pode esperar muito aumento da compactação do tipo de dados time. |
datetime2 |
Sim |
Usa a representação de dados de inteiro usando de 6 a 9 bytes. Os primeiros 4 bytes representam a data. Os bytes ocupados pela hora dependem da precisão da hora que é especificada. O valor de inteiro representa o número de dias desde 1/1/0001 com um limite superior de 31/12/9999. Para representar uma data no ano 2005, a compactação utiliza 3 bytes. Não há aumento de hora porque é permitido de 2 a 4 bytes para várias precisões de hora. Portanto, para precisão de um segundo, a compactação usa 2 bytes para a hora, que ocupa o segundo byte depois de 255 segundos. |
datetimeoffset |
Sim |
Semelhante a datetime2, exceto pelo fato de que há 2 bytes de fuso horário do formato (HH:MM). Como datetime2, a compactação pode salvar 2 bytes. Para valores de fuso horário, o valor MM pode ser 0 na maioria dos casos. Portanto, a compactação pode salvar possivelmente 1 byte. Não há alteração alguma no armazenamento para compactação de linha. |
char |
Sim |
Caracteres de preenchimento à direita são removidos. Observe que o Mecanismo de Banco de Dados insere o mesmo caractere de preenchimento, independentemente do agrupamento usado. |
varchar |
Não |
Nenhum efeito. |
text |
Não |
Nenhum efeito. |
nchar |
Sim |
Caracteres de preenchimento à direita são removidos. Observe que o Mecanismo de Banco de Dados insere o mesmo caractere de preenchimento, independentemente do agrupamento usado. |
nvarchar |
Não |
Nenhum efeito. |
ntext |
Não |
Nenhum efeito. |
binary |
Sim |
Zeros à direita são removidos. |
varbinary |
Não |
Nenhum efeito. |
image |
Não |
Nenhum efeito. |
cursor |
Não |
Nenhum efeito. |
timestamp / rowversion |
Sim |
Usa a representação de dados inteiros com 8 bytes. Há um contador de carimbo de data/hora mantido para cada banco de dados e seu valor começa em 0. Ele pode ser compactado como qualquer outro valor de inteiro. |
sql_variant |
Não |
Nenhum efeito. |
uniqueidentifier |
Não |
Nenhum efeito. |
table |
Não |
Nenhum efeito. |
xml |
Não |
Nenhum efeito. |
Tipos definidos pelo usuário |
Não |
É representado internamente como varbinary. |
FILESTREAM |
Não |
É representado internamente como varbinary. |