Implementazione della compressione di riga
In questo argomento vengono riepilogate le modalità di implementazione della compressione di riga nel Motore di database. 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 di riga influisce sui tipi esistenti in SQL Server. Nella tabella non sono inclusi i risparmi in termini di spazio che possono essere ottenuti utilizzando la compressione di pagina.
Tipo di dati |
Influenza sull'archiviazione |
Descrizione |
---|---|---|
tinyint |
No |
Lo spazio di archiviazione minimo necessario è 1 byte. |
smallint |
Sì |
Se il valore può essere archiviato in 1 byte, verrà utilizzato solo 1 byte. |
int |
Sì |
Utilizza solo i byte necessari. Ad esempio, se un valore può essere archiviato in 1 byte, verrà utilizzato solo 1 byte. |
bigint |
Sì |
Utilizza solo i byte necessari. Ad esempio, se un valore può essere archiviato in 1 byte, verrà utilizzato solo 1 byte. |
decimal |
Sì |
Questa archiviazione corrisponde al formato di archiviazione vardecimal. Per ulteriori informazioni, vedere Archiviazione di dati decimal come lunghezza variabile. |
numeric |
Sì |
Questa archiviazione corrisponde al formato di archiviazione vardecimal. Per ulteriori informazioni, vedere Archiviazione di dati decimal come lunghezza variabile. |
bit |
Sì |
L'overhead di metadati aumenta questo valore a 4 bit. |
smallmoney |
Sì |
Rappresenta i dati integer utilizzando un numero intero di 4 byte. Il valore della valuta viene moltiplicato per 10.000 e il valore integer risultante viene archiviato rimuovendo tutte le cifre dopo il separatore decimale. A questo tipo è associata un'ottimizzazione dell'archiviazione analoga a quella associata ai tipi integer. |
money |
Sì |
Rappresenta i dati integer utilizzando un numero intero di 8 byte. Il valore della valuta viene moltiplicato per 10.000 e il valore integer 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 |
Sì |
I byte meno significativi con gli zero non vengono archiviati. La compressione float è applicabile soprattutto ai valori non frazionari nella mantissa. |
real |
Sì |
I byte meno significativi con gli zero non vengono archiviati. La compressione real è applicabile soprattutto ai valori non frazionari nella mantissa. |
smalldatetime |
No |
Rappresenta i dati integer utilizzando due numeri interi di 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 |
Sì |
Rappresenta i dati integer utilizzando due numeri interi di 4 byte. Il valore integer 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 integer 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 utilizzando 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 utilizzando un numero di byte compreso tra 3 e 6. Sono disponibili diversi valori di precisione, da 0 a 9, rappresentabili con un numero di byte compreso tra 3 e 6. Lo spazio compresso viene utilizzato nel modo seguente:
La compressione di riga non apporta alcuna modifica all'archiviazione. In generale, se si comprime il tipo di dati time, non è possibile prevedere un risparmio significativo in termini di spazio. |
datetime2 |
Sì |
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 integer 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 |
Sì |
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 |
Sì |
I caratteri di riempimento finali vengono rimossi. Si noti che in Motore di database viene inserito lo stesso carattere di riempimento indipendentemente dalle regole di confronto utilizzate. |
varchar |
No |
Nessun effetto. |
text |
No |
Nessun effetto. |
nchar |
Sì |
I caratteri di riempimento finali vengono rimossi. Si noti che in Motore di database viene inserito lo stesso carattere di riempimento indipendentemente dalle regole di confronto utilizzate. |
nvarchar |
No |
Nessun effetto. |
ntext |
No |
Nessun effetto. |
binary |
Sì |
Gli zero finali vengono rimossi. |
varbinary |
No |
Nessun effetto. |
image |
No |
Nessun effetto. |
cursor |
No |
Nessun effetto. |
timestamp / rowversion |
Sì |
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 integer. |
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 |
Rappresentato internamente come varbinary. |
Vedere anche