Implementazione della compressione di rigaRow Compression Implementation

QUESTO ARGOMENTO SI APPLICA A: sìSQL Server (a partire dalla versione 2016)sìDatabase SQL di AzurenoAzure SQL Data Warehouse noParallel Data Warehouse THIS TOPIC APPLIES TO: yesSQL Server (starting with 2016)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

In questo argomento vengono riepilogate le modalità di implementazione della compressione di riga nel Motore di databaseDatabase Engine .This topic summarizes how Motore di databaseDatabase Engine implements row compression. Tale riepilogo fornisce informazioni di base che consentono di pianificare lo spazio di archiviazione necessario per i dati.This summary provides basic information to help you plan the storage space that you need for your data.

L'abilitazione della compressione modifica solo il formato di archiviazione fisica dei dati associato a un tipo di dati, ma non la relativa sintassi o semantica.Enabling compression only changes the physical storage format of the data that is associated with a data type but not its syntax or semantics. Le modifiche alle applicazioni non sono obbligatorie quando una o più tabelle sono abilitate per la compressione.Application changes are not required when one or more tables are enabled for compression. Al nuovo formato di archiviazione del record sono associate le seguenti modifiche principali:The new record storage format has the following main changes:

  • Riduzione dell'overhead di metadati associati al record.It reduces the metadata overhead that is associated with the record. Tali metadati rappresentano informazioni su colonne e sui relativi offset e lunghezze.This metadata is information about columns, their lengths and offsets. In alcuni casi, l'overhead di metadati potrebbe essere maggiore del formato di archiviazione obsoleto.In some cases, the metadata overhead might be larger than the old storage format.

  • Uso del formato di archiviazione a lunghezza variabile per i tipi numerici (come integer, decimale float) e i tipi basati su quello numerico (come datetime e money).It uses variable-length storage format for numeric types (for example integer, decimal, and float) and the types that are based on numeric (for example datetime and money).

  • Archiviazione di stringhe di caratteri a lunghezza fissa utilizzando un formato a lunghezza variabile senza archiviare i caratteri vuoti.It stores fixed character strings by using variable-length format by not storing the blank characters.

Nota

Ottimizzazione dei valori NULL e 0 per tutti i tipi di dati in modo che non occupino alcun byte.NULL and 0 values across all data types are optimized and take no bytes.

Influenza della compressione di riga sull'archiviazioneHow Row Compression Affects Storage

Nella tabella seguente è descritto il modo in cui la compressione di riga influisce sui tipi esistenti in SQL ServerSQL Server e Database SQL di AzureAzure SQL Database.The following table describes how row compression affects the existing types in SQL ServerSQL Server and Database SQL di AzureAzure SQL Database. Nella tabella non sono inclusi i risparmi in termini di spazio che possono essere ottenuti usando la compressione di pagina.The table does not include the savings that can be achieved by using page compression.

Tipo di datiData type Influenza sull'archiviazioneIs storage affected? DescrizioneDescription
tinyinttinyint NoNo Lo spazio di archiviazione minimo necessario è 1 byte.1 byte is the minimum storage needed.
smallintsmallint Yes Se il valore può essere archiviato in 1 byte, verrà utilizzato solo 1 byte.If the value fits in 1 byte, only 1 byte will be used.
intint Yes Utilizza solo i byte necessari.Uses only the bytes that are needed. Ad esempio, se un valore può essere archiviato in 1 byte, verrà utilizzato solo 1 byte.For example, if a value can be stored in 1 byte, storage will take only 1 byte.
bigintbigint Yes Utilizza solo i byte necessari.Uses only the bytes that are needed. Ad esempio, se un valore può essere archiviato in 1 byte, verrà utilizzato solo 1 byte.For example, if a value can be stored in 1 byte, storage will take only 1 byte.
decimaldecimal Yes Questa archiviazione corrisponde al formato di archiviazione vardecimal.This storage is exactly same as the vardecimal storage format.
numericnumeric Yes Questa archiviazione corrisponde al formato di archiviazione vardecimal.This storage is exactly same as the vardecimal storage format.
bitbit Yes L'overhead di metadati aumenta questo valore a 4 bit.The metadata overhead brings this to 4 bits.
smallmoneysmallmoney Yes Rappresenta i dati Integer utilizzando un numero intero di 4 byte.Uses the integer data representation by using a 4-byte integer. Il valore della valuta viene moltiplicato per 10.000 e il valore intero risultante viene archiviato rimuovendo tutte le cifre dopo il separatore decimale.Currency value is multiplied by 10000 and the resulting integer value is stored by removing any digits after the decimal point. e un'ottimizzazione dell'archiviazione analoga a quella associata ai tipi Integer.This type has a storage optimization similar to that for integer types.
moneymoney Yes Rappresenta i dati Integer utilizzando un Integer a 8 byte.Uses the integer data representation by using an 8-byte integer. Il valore della valuta viene moltiplicato per 10.000 e il valore intero risultante viene archiviato rimuovendo tutte le cifre dopo il separatore decimale.Currency value is multiplied by 10000 and the resulting integer value is stored by removing any digits after the decimal point. A questo tipo sono associati un intervallo maggiore rispetto a smallmoney.This type has a larger range than smallmoney. e un'ottimizzazione dell'archiviazione analoga a quella associata ai tipi Integer.This type has a storage optimization similar to that for integer types.
floatfloat Yes Il byte meno significativi con zeri non sono archiviati.Least significant bytes with zeros are not stored. La compressionefloat si applica soprattutto per valori non frazionari in mantissa.float compression is applicable mostly for nonfractional values in mantissa.
realreal Yes Il byte meno significativi con zeri non sono archiviati.Least significant bytes with zeros are not stored. La compressionereal si applica soprattutto per valori non frazionari in mantissa.real compression is applicable mostly for nonfractional values in mantissa.
smalldatetimesmalldatetime NoNo Rappresenta i dati Integer usando due numeri interi a 2 byte.Uses the integer data representation by using two 2-byte integers. Per una data, sono necessari due 2 byte.The date takes 2 bytes. La data rappresenta il numero di giorni dall'1/1/1901.It is the number of days since 1/1/1901. Poiché a partire dal 1902 è necessario utilizzare 2 byte,This needs 2 bytes starting from 1902. dopo tale data non viene ottenuto alcun risparmio in termini di spazio.Therefore, there is no savings after that point.

L'ora rappresenta il numero di minuti a partire dalla mezzanotte.The time is the number of minutes since midnight. Per i valori di ora appena successivi alle 04.00, viene utilizzato il secondo byte.Time values that are slightly past 4AM start to use the second byte.

Se un tipo di dati smalldatetime viene usato solo per rappresentare una data (caso comune), l'ora è 0.0.If a smalldatetime is only used to represent a date (a common case), the time is 0.0. La compressione consente di risparmiare 2 byte archiviando l'ora nel formato con byte più significativo per la compressione di riga.Compression saves 2 bytes by storing the time in most significant byte format for row compression.
datetimedatetime Yes Rappresenta i dati Integer utilizzando due numeri interi di 4 byte.Uses the integer data representation by using two 4-byte integers. Il numero intero rappresenta il numero di giorni con data di base 1/1/1900.The integer value represents the number of days with base date of 1/1/1900. I primi 2 byte possono rappresentare gli anni fino al 2079.The first 2 bytes can represent up to the year 2079. In questo caso la compressione consente di risparmiare sempre 2 byte fino a quella data.Compression can always save 2 bytes here until that point. Ogni valore intero rappresenta 3,33 millisecondi.Each integer value represents 3.33 milliseconds. Poiché la compressione esaurisce i primi 2 byte nei i primi cinque minuti e deve utilizzare il quarto byte dopo le 16.00,Compression exhausts the first 2 bytes in first five minutes and needs the fourth byte after 4PM. a partire da tale ora è possibile risparmiare solo 1 byte in termini di spazio.Therefore, compression can save only 1 byte after 4PM. Quando datetime viene compresso come qualsiasi altro numero intero, la compressione consente di risparmiare 2 byte nell'archiviazione della data.When datetime is compressed like any other integer, compression saves 2 bytes in the date.
datadate NoNo Rappresenta i dati Integer usando 3 byte.Uses the integer data representation by using 3 bytes. In questo modo è possibile rappresentare la data a partire dall'1/1/0001.This represents the date from 1/1/0001. Poiché per le date contemporanee la compressione di riga utilizza tutti i 3 byte,For contemporary dates, row compression uses all 3 bytes. non viene ottenuto alcun risparmio in termini di spazio.This achieves no savings.
timetime NoNo Rappresenta i dati Integer usando da 3 a 6 byte.Uses the integer data representation by using 3 to 6 bytes. Sono disponibili diversi valori di precisione, da 0 a 9, rappresentabili con un numero di byte compreso tra 3 e 6.There are various precisions that start with 0 to 9 that can take 3 to 6 bytes. Lo spazio compresso viene utilizzato nel modo seguente:Compressed space is used as follows:

Precisione = 0. Byte = 3.Precision = 0. Bytes = 3. Ogni valore intero rappresenta un secondo.Each integer value represents a second. La compressione può rappresentare le ore fino alle 18.00 utilizzando 2 byte, con un risparmio potenziale di 1 byte.Compression can represent time up to 6PM by using 2 bytes, potentially saving 1 byte.

Precisione = 1. Byte = 3.Precision = 1. Bytes = 3. Ogni valore intero rappresenta 1/10 secondi.Each integer value represents 1/10 seconds. Poiché la compressione utilizza il terzo byte prima delle 02.00,Compression uses the third byte before 2AM. il risparmio in termini di spazio è ridotto.Results in little savings.

Precisione = 2. Byte = 3.Precision = 2. Bytes = 3. Caso analogo al precedente. È improbabile ottenere un risparmio.Similar to the previous case, it is unlikely to achieve savings.

Precisione = 3. Byte = 4.Precision = 3. Bytes = 4. Poiché i primi 3 byte vengono utilizzati prima delle 05.00, il risparmio ottenuto è ridotto.Because the first 3 bytes are taken by 5AM, achieves little savings.

Precisione = 4. Byte = 4.Precision = 4. Bytes = 4. Poiché i primi 3 byte vengono utilizzati nei primi 27 secondi,The first 3 bytes are taken in the first 27 seconds. non viene ottenuto alcun risparmio in termini di spazio.No savings are expected.

Precisione = 5, Byte = 5.Precision = 5, Bytes = 5. Il quinto byte verrà utilizzato dopo le 12.00.Fifth byte will be used after 12-noon.

Precisione = 6 e 7, Byte = 5.Precision = 6 and 7, Bytes = 5. Non viene ottenuto alcun risparmio in termini di spazio.Achieves no savings.

Precisione = 8, Byte = 6.Precision = 8, Bytes = 6. Il sesto byte verrà utilizzato dopo le 03.00.Sixth byte will be used after 3AM.



La compressione di riga non comporta alcuna modifica nell'archiviazione.Note that there is no change in storage for row compression. In generale, se si comprime il tipo di dati time , non è possibile prevedere un risparmio significativo in termini di spazio.Overall, not much savings can be expected from compressing the time data type.
datetime2datetime2 Yes Rappresenta i dati Integer utilizzando un numero di byte compreso tra 6 e 9.Uses the integer data representation by using 6 to 9 bytes. I primi 4 byte rappresentano la data.The first 4 bytes represent the date. I byte utilizzati per rappresentare l'ora dipenderanno dalla precisione dell'ora specificata.The bytes taken by the time will depend on the precision of the time that is specified.

Il valore intero rappresenta il numero di giorni a partire dall'1/1/0001. Il limite superiore è la data del 31/12/9999.The integer value represents the number of days since 1/1/0001 with an upper bound of 12/31/9999. Per rappresentare una data nell'anno 2005, la compressione utilizza 3 byte.To represent a date in year 2005, compression takes 3 bytes.

Non viene ottenuto alcun risparmio nella rappresentazione dell'ora, poiché è consentito l'utilizzo di un numero di byte compreso tra 2 e 4 per valori di precisione dell'ora diversi.There is no savings on time because it allows for 2 to 4 bytes for various time precisions. Di conseguenza, per rappresentare l'ora con valore di precisione di un secondo, la compressione utilizza 2 byte e il secondo byte viene utilizzato dopo 255 secondi.Therefore, for one-second time precision, compression uses 2 bytes for time, which takes the second byte after 255 seconds.
datetimeoffsetdatetimeoffset Yes Tipo simile a datetime2, a parte il fatto che in questo caso sono disponibili 2 byte per il fuso orario in formato (HH.MM).Resembles datetime2, except that there are 2 bytes of time zone of the format (HH:MM).

Analogamente a datetime2, la compressione consente di risparmiare 2 byte.Like datetime2, compression can save 2 bytes.

Per i valori del fuso orario, il valore MM potrebbe essere uguale a 0 per la maggior parte dei casi.For time zone values, MM value might be 0 for most cases. Di conseguenza, la compressione consente di risparmiare 1 byte.Therefore, compression can possibly save 1 byte.

La compressione di riga non apporta alcuna modifica all'archiviazione.There are no changes in storage for row compression.
charchar Yes I caratteri di riempimento finali vengono rimossi.Trailing padding characters are removed. Si noti che in Motore di databaseDatabase Engine viene inserito lo stesso carattere di riempimento indipendentemente dalle regole di confronto utilizzate.Note that the Motore di databaseDatabase Engine inserts the same padding character regardless of the collation that is used.
varcharvarchar NoNo Nessun effetto.No effect.
texttext NoNo Nessun effetto.No effect.
ncharnchar Yes I caratteri di riempimento finali vengono rimossi.Trailing padding characters are removed. Si noti che in Motore di databaseDatabase Engine viene inserito lo stesso carattere di riempimento indipendentemente dalle regole di confronto utilizzate.Note that the Motore di databaseDatabase Engine inserts the same padding character regardless of the collation that is used.
nvarcharnvarchar NoNo Nessun effetto.No effect.
ntextntext NoNo Nessun effetto.No effect.
binarybinary Yes Gli zero finali vengono rimossi.Trailing zeros are removed.
varbinaryvarbinary NoNo Nessun effetto.No effect.
imageimage NoNo Nessun effetto.No effect.
cursorcursor NoNo Nessun effetto.No effect.
timestamp / rowversiontimestamp / rowversion Yes Rappresenta i dati Integer utilizzando 8 byte.Uses the integer data representation by using 8 bytes. È disponibile un contatore timestamp gestito per ogni database, il cui valore iniziale è pari a 0.There is a timestamp counter that is maintained for each database, and its value starts from 0. È possibile comprimere questo tipo in modo analogo a qualsiasi altro valore intero.This can be compressed like any other integer value.
sql_variantsql_variant NoNo Nessun effetto.No effect.
uniqueidentifieruniqueidentifier NoNo Nessun effetto.No effect.
tabletable NoNo Nessun effetto.No effect.
xmlxml NoNo Nessun effetto.No effect.
Tipi definiti dall'utenteUser-defined types NoNo Rappresentati internamente come varbinary.This is represented internally as varbinary.
FILESTREAMFILESTREAM NoNo Rappresentati internamente come varbinary.This is represented internally as varbinary.

Vedere ancheSee Also

Compressione dei dati Data Compression
Implementazione della compressione di pagina Page Compression Implementation