Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Base 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.