Share via


Implementazione della compressione di riga

Questo argomento riepiloga il modo in cui il motore di database implementa la compressione delle righe. Tale riepilogo fornisce informazioni di base che consentono di pianificare lo spazio di archiviazione necessario per i dati.

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. Le modifiche alle applicazioni non sono obbligatorie quando una o più tabelle sono abilitate per la compressione. Al nuovo formato di archiviazione del record sono associate le seguenti modifiche principali:

  • Riduzione dell'overhead di metadati associati al record. Tali metadati rappresentano informazioni su colonne e sui relativi offset e lunghezze. In alcuni casi, l'overhead di metadati potrebbe essere maggiore del formato di archiviazione obsoleto.

  • Utilizzo del formato di archiviazione a lunghezza variabile per i tipi numerici, ad esempio integer, decimal e float, e i tipi basati su quello numerico, ad esempio datetime e money.

  • Archiviazione di stringhe di caratteri a lunghezza fissa utilizzando un formato a lunghezza variabile senza archiviare i caratteri vuoti.

Nota

Ottimizzazione dei valori NULL e 0 per tutti i tipi di dati in modo che non occupino alcun byte.

Influenza della compressione di riga sull'archiviazione

Nella tabella seguente viene descritto il modo in cui la compressione delle righe influisce sui tipi esistenti in SQL Server. Nella tabella non sono inclusi i risparmi in termini di spazio che possono essere ottenuti usando la compressione di pagina.

Tipo di dati Influenza sull'archiviazione Descrizione
tinyint No Lo spazio di archiviazione minimo necessario è 1 byte.
smallint Se il valore può essere archiviato in 1 byte, verrà utilizzato solo 1 byte.
int Utilizza solo i byte necessari. Ad esempio, se un valore può essere archiviato in 1 byte, verrà utilizzato solo 1 byte.
bigint Utilizza solo i byte necessari. Ad esempio, se un valore può essere archiviato in 1 byte, verrà utilizzato solo 1 byte.
decimal Questa archiviazione corrisponde al formato di archiviazione vardecimal.
numeric Questa archiviazione corrisponde al formato di archiviazione vardecimal.
bit L'overhead di metadati aumenta questo valore a 4 bit.
smallmoney Rappresenta i dati Integer utilizzando un numero intero di 4 byte. Il valore della valuta viene moltiplicato per 10.000 e il valore intero risultante viene archiviato rimuovendo tutte le cifre dopo il separatore decimale. e un'ottimizzazione dell'archiviazione analoga a quella associata ai tipi Integer.
money Rappresenta i dati Integer utilizzando un Integer a 8 byte. Il valore della valuta viene moltiplicato per 10.000 e il valore intero risultante viene archiviato rimuovendo tutte le cifre dopo il separatore decimale. A questo tipo sono associati un intervallo maggiore rispetto a smallmoney e un'ottimizzazione dell'archiviazione analoga a quella associata ai tipi Integer.
float Il byte meno significativi con zeri non sono archiviati. La compressione float si applica soprattutto per valori non frazionari in mantissa.
real Il byte meno significativi con zeri non sono archiviati. La compressione real si applica soprattutto per valori non frazionari in mantissa.
smalldatetime No Rappresenta i dati Integer usando due numeri interi a 2 byte. Per una data, sono necessari due 2 byte. La data rappresenta il numero di giorni dall'1/1/1901. Poiché a partire dal 1902 è necessario utilizzare 2 byte, dopo tale data non viene ottenuto alcun risparmio in termini di spazio.

L'ora rappresenta il numero di minuti a partire dalla mezzanotte. Per i valori di ora appena successivi alle 04.00, viene utilizzato il secondo byte.

Se un tipo di dati smalldatetime viene utilizzato solo per rappresentare una data (caso comune), l'ora è 00.00. La compressione consente di risparmiare 2 byte archiviando l'ora nel formato con byte più significativo per la compressione di riga.
datetime Rappresenta i dati Integer utilizzando due numeri interi di 4 byte. Il numero intero rappresenta il numero di giorni con data di base 1/1/1900. I primi 2 byte possono rappresentare gli anni fino al 2079. In questo caso la compressione consente di risparmiare sempre 2 byte fino a quella data. Ogni valore intero rappresenta 3,33 millisecondi. Poiché la compressione esaurisce i primi 2 byte nei i primi cinque minuti e deve utilizzare il quarto byte dopo le 16.00, a partire da tale ora è possibile risparmiare solo 1 byte in termini di spazio. Quando datetime viene compresso come qualsiasi altro numero intero, la compressione consente di risparmiare 2 byte nell'archiviazione della data.
date No Rappresenta i dati Integer usando 3 byte. In questo modo è possibile rappresentare la data a partire dall'1/1/0001. Poiché per le date contemporanee la compressione di riga utilizza tutti i 3 byte, non viene ottenuto alcun risparmio in termini di spazio.
time No Rappresenta i dati Integer usando da 3 a 6 byte. Sono disponibili diversi valori di precisione, da 0 a 9, rappresentabili con un numero di byte compreso tra 3 e 6. La compressione di riga non comporta alcuna modifica nell'archiviazione. In generale, se si comprime il tipo di dati time, non è possibile prevedere un risparmio significativo in termini di spazio. Lo spazio compresso viene utilizzato nel modo seguente:

Precisione = 0. Byte = 3. Ogni valore intero rappresenta un secondo. La compressione può rappresentare le ore fino alle 18.00 utilizzando 2 byte, con un risparmio potenziale di 1 byte.

Precisione = 1. Byte = 3. Ogni valore intero rappresenta 1/10 secondi. Poiché la compressione utilizza il terzo byte prima delle 02.00, il risparmio in termini di spazio è ridotto.

Precisione = 2. Byte = 3. Caso analogo al precedente. È improbabile ottenere un risparmio.

Precisione = 3. Byte = 4. Poiché i primi 3 byte vengono utilizzati prima delle 05.00, il risparmio ottenuto è ridotto.

Precisione = 4. Byte = 4. Poiché i primi 3 byte vengono utilizzati nei primi 27 secondi, non viene ottenuto alcun risparmio in termini di spazio.

Precisione = 5, byte = 5. Il quinto byte verrà utilizzato dopo le 12.00.

Precisione = 6 e 7. Byte = 5. Non viene ottenuto alcun risparmio in termini di spazio.

Precisione = 8. Byte = 6. Il sesto byte verrà utilizzato dopo le 03.00.
datetime2 Rappresenta i dati Integer utilizzando un numero di byte compreso tra 6 e 9. I primi 4 byte rappresentano la data. I byte utilizzati per rappresentare l'ora dipenderanno dalla precisione dell'ora specificata.

Il valore intero rappresenta il numero di giorni a partire dall'1/1/0001. Il limite superiore è la data del 31/12/9999. Per rappresentare una data nell'anno 2005, la compressione utilizza 3 byte.

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. 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.
datetimeoffset Tipo simile a datetime2, ad eccezione che in questo caso sono disponibili 2 byte per il fuso orario in formato (HH.MM).

Analogamente a datetime2, la compressione consente di risparmiare 2 byte.

Per i valori del fuso orario, il valore MM potrebbe essere uguale a 0 per la maggior parte dei casi. Di conseguenza, la compressione consente di risparmiare 1 byte.

La compressione di riga non apporta alcuna modifica all'archiviazione.
char I caratteri di riempimento finali vengono rimossi. Si noti che il motore di database inserisce lo stesso carattere di spaziatura interna indipendentemente dalle regole di confronto utilizzate.
varchar No Nessun effetto.
text No Nessun effetto.
nchar I caratteri di riempimento finali vengono rimossi. Si noti che il motore di database inserisce lo stesso carattere di spaziatura interna indipendentemente dalle regole di confronto utilizzate.
nvarchar No Nessun effetto.
ntext No Nessun effetto.
binary Gli zero finali vengono rimossi.
varbinary No Nessun effetto.
image No Nessun effetto.
cursor No Nessun effetto.
timestamp / rowversion Rappresenta i dati Integer utilizzando 8 byte. È disponibile un contatore timestamp gestito per ogni database, il cui valore iniziale è pari a 0. È possibile comprimere questo tipo in modo analogo a qualsiasi altro valore intero.
sql_variant No Nessun effetto.
uniqueidentifier No Nessun effetto.
table No Nessun effetto.
xml No Nessun effetto.
Tipi definiti dall'utente No Rappresentati internamente come varbinary.
FILESTREAM No Rappresentati internamente come varbinary.

Vedere anche

Compressione dei dati
Implementazione della compressione di pagina