Partilhar via


Implementação de compressão de linhas

Aplica-se a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBase de dados SQL no Microsoft Fabric

Este artigo resume como o Database Engine implementa compressão de linhas. Este resumo fornece informações básicas para o ajudar a planear o espaço de armazenamento de que precisa para os seus dados.

Ativar a compressão só altera o formato físico de armazenamento dos dados associados a um tipo de dado, mas não a sua sintaxe ou semântica. Não são necessárias alterações na aplicação quando uma ou mais tabelas estão ativadas para compressão. O novo formato de armazenamento de registos apresenta as seguintes principais alterações:

  • Reduz a sobrecarga de metadados associada ao registo. Estes metadados são informações sobre colunas, os seus comprimentos e deslocamentos. Em alguns casos, a sobrecarga de metadados pode ser maior do que no formato de armazenamento antigo.

  • Utiliza um formato de armazenamento de comprimento variável para tipos numéricos (por exemplo, inteiro, decimal e flutuante) e para os tipos baseados em números (por exemplo, data, hora e dinheiro).

  • Armazena cadeias de caracteres fixas usando o formato de comprimento variável, não armazenando os caracteres em branco.

Observação

NULL e 0 os valores em todos os tipos de dados são otimizados e não ocupam bytes.

Como a compressão das filas afeta o armazenamento

A tabela seguinte descreve como a compressão de linhas afeta os tipos existentes no SQL Server e na Azure SQL Database. A tabela não inclui as poupanças que podem ser alcançadas ao usar compressão de página.

Tipo de dados O armazenamento é afetado? Description
tinyint Não 1 byte é o armazenamento mínimo necessário.
smallint Yes Se o valor caber em 1 byte, apenas 1 byte é utilizado.
int Yes Usa apenas os bytes necessários. Por exemplo, se um valor puder ser armazenado em 1 byte, o armazenamento ocupa apenas 1 byte.
bigint Yes Usa apenas os bytes necessários. Por exemplo, se um valor puder ser armazenado em 1 byte, o armazenamento ocupa apenas 1 byte.
decimal Yes Utiliza apenas os bytes necessários, independentemente da precisão especificada. Por exemplo, se um valor puder ser armazenado em 3 bytes, o armazenamento ocupa apenas 3 bytes. A área de armazenamento é exatamente a mesma do formato vardecimal .
numérico Yes Utiliza apenas os bytes necessários, independentemente da precisão especificada. Por exemplo, se um valor puder ser armazenado em 3 bytes, o armazenamento ocupa apenas 3 bytes. A área de armazenamento é exatamente a mesma do formato vardecimal .
bit Yes A sobrecarga de metadados aumenta o total para 4 bits.
dinheiro pequeno Yes Utiliza a representação dos dados inteiros usando um inteiro de 4 bytes. O valor da moeda é multiplicado por 10.000 e o valor inteiro resultante é armazenado removendo quaisquer dígitos após a vírgula decimal. Este tipo tem uma otimização de armazenamento semelhante à dos tipos inteiros.
dinheiro Yes Utiliza a representação dos dados inteiros usando um inteiro de 8 bytes. O valor da moeda é multiplicado por 10.000 e o valor inteiro resultante é armazenado removendo quaisquer dígitos após a vírgula decimal. Este tipo tem um alcance maior do que o smallmoney. Este tipo tem uma otimização de armazenamento semelhante à dos tipos inteiros.
float Yes Bytes menos significativos com zeros não são armazenados. A compressão flutuante é aplicável principalmente a valores não fracionários em mantissas.
real Yes Bytes menos significativos com zeros não são armazenados. A compressão real é aplicável principalmente a valores não fracionários na mantissa.
smalldatetime Não Usa a representação dos dados inteiros usando dois inteiros de 2 bytes, e é o número de dias desde 1900-01-01. Não há benefício de compressão de linhas na parte do date do smalldatetime.

O tempo é o número de minutos desde a meia-noite. Os valores de tempo que passam ligeiramente das 4h começam a usar o segundo byte.

Se um smalldatetime for usado apenas para representar uma data (um caso comum), o tempo é 0.0. A compressão poupa 2 bytes ao armazenar o tempo no formato de byte mais significativo para compressão de linhas.
datetime Yes Utiliza a representação dos dados inteiros usando dois inteiros de 4 bytes. O valor inteiro representa o número de dias com data base de 1900-01-01. Os primeiros 2 bytes podem representar até ao ano 2079. A compressão pode sempre poupar 2 bytes até esse ponto. Cada valor inteiro representa 3,33 milissegundos. A compressão esgota os primeiros 2 bytes nos primeiros cinco minutos e precisa do quarto byte depois das 16h. Portanto, a compressão só pode poupar 1 byte após as 16h. Quando a data-hora é comprimida como qualquer outro inteiro, a compressão poupa 2 bytes na data.
date Não Utiliza a representação dos dados inteiros usando 3 bytes. Isto representa a data a partir de 0001-01-01. Para datas contemporâneas, a compressão de linhas utiliza todos os 3 bytes. Isto não garante poupanças.
time Não Utiliza a representação dos dados inteiros usando 3 a 6 bytes. Existem várias precisões que começam de 0 a 9 e que podem ocupar entre 3 e 6 bytes. O espaço comprimido é utilizado da seguinte forma:

Precisão = 0. Bytes = 3. Cada valor inteiro representa um segundo. A compressão pode representar o tempo até às 18h usando 2 bytes, potencialmente poupando 1 byte.

Precisão = 1. Bytes = 3. Cada valor inteiro representa 1/10 de segundos. A compressão usa o terceiro byte antes das 2h da manhã. Resulta em poupanças reduzidas.

Precisão = 2. Bytes = 3. Tal como no caso anterior, é improvável que se obtenha poupanças.

Precisão = 3. Bytes = 4. Como os primeiros 3 bytes são ocupados até às 5:00, esta opção poupa pouco.

Precisão = 4. Bytes = 4. Os primeiros 3 bytes são retirados nos primeiros 27 segundos. Não se esperam poupanças.

Precisão = 5, Bytes = 5. O quinto byte será usado depois do meio-dia.

Precisão = 6 e 7, Bytes = 5. Não obtém poupanças.

Precisão = 8, Bytes = 6. O sexto byte será usado depois das 3h da manhã.

Não há alterações no armazenamento para compressão de linhas. No geral, não se pode esperar grande poupança ao comprimir o tipo de dado temporal .
datetime2 Yes Utiliza a representação dos dados inteiros usando 6 a 9 bytes. Os primeiros 4 bytes representam a data. Os bytes ocupados pelo tempo dependem da precisão do tempo especificado.

O valor inteiro representa o número de dias desde 0001-01-01 então, com um limite superior de 31/12/9999. Para representar uma data no ano de 2005, a compressão demora 3 bytes.

Não há poupança de tempo porque permite 2 a 4 bytes para várias precisões temporais. Portanto, para precisão temporal de um segundo, a compressão usa 2 bytes para o tempo, que ocupa o segundo byte após 255 segundos.
datetimeoffset Yes Assemelha-se a datetime2, exceto que há 2 bytes de fuso horário do formato (HH:mm).

Tal como o datetime2, a compressão pode poupar 2 bytes.

Para valores de fusos horários, o mm valor pode ser 0 para a maioria dos casos. Portanto, a compressão pode possivelmente poupar 1 byte.

Não há alterações no armazenamento para compressão de linhas.
char Yes Os caracteres de preenchimento posteriores são removidos. O Motor de Base de Dados insere o mesmo caractere de enchimento independentemente da colação utilizada.
Varchar Não Sem efeito.
texto Não Sem efeito.
Nchar Sim 1 Os caracteres de preenchimento posteriores são removidos. O Motor de Base de Dados insere o mesmo caractere de enchimento independentemente da colação utilizada.
nvarchar N.º 1 Sem efeito.
ntext Não Sem efeito.
binary Yes Os zeros finais são removidos.
Varbinary Não Sem efeito.
image Não Sem efeito.
Cursor Não Sem efeito.
Carimbo de data/hora / versão de linha Yes Utiliza a representação dos dados inteiros usando 8 bytes. Existe um contador de carimbo temporal que é mantido para cada base de dados, e o seu valor começa em 0. Isto pode ser comprimido como qualquer outro valor inteiro.
sql_variant Não Sem efeito.
uniqueidentifier Não Sem efeito.
table Não Sem efeito.
xml Não 2 Sem efeito.
Tipos definidos pelo usuário Não Isto é representado internamente como varbinário.
FILESTREAM Não Isto é representado internamente como varbinário.

1 A compressão Unicode suporta os tipos de dados nchar e nvarchar de comprimento fixo. Os valores de dados armazenados fora da linha ou em colunas nvarchar(max ) não são comprimidos. A compressão Unicode não é suportada para dados nvarchar(max ), mesmo que estejam armazenados em linha.

2 Os dados fora da linha não são comprimidos ao ativar a compressão de dados. Por exemplo, um registo XML com mais de 8.060 bytes usa páginas fora da linha, que não são comprimidas.