Su Twitter di recente, ho chiesto:
Qualcuno che conosco usa le funzionalità
COMPRESS
eDECOMPRESS
in T-SQL?
A coloro che hanno risposto affermativamente, ho chiesto:
Cosa ti ha fatto decidere su questo in contrasto con la compressione
ROW
oPAGE
?
Joey D’Antoni (blog | Twitter), uno dei miei coautori, mi ha ricordato che la compressione di righe e pagine non funziona su dati LOB (“large object”). Dave Dustin (Twitter) e Niko Neugebauer (blog | Twitter) hanno dichiarato di utilizzare specificamente COMPRESS
per i dati LOB per questo motivo.
Modifiche al codice
L’utilizzo di queste funzioni richiede modifiche al codice esistente poiché è necessario utilizzare la funzione COMPRESS
durante l’inserimento dei dati. Dave e Niko lo hanno fatto nascondendo la funzionalità all’interno di views.
Se non è possibile apportare modifiche al codice al proprio ambiente, potrebbe essere necessario ricorrere alla compressione di righe e pagine o eventualmente agli indici columnstore.
Come funziona?
Rilasciato con SQL Server 2016, COMPRESS
sfrutta l’algoritmo di compressione gzip open source e può ridurre lo spazio utilizzato fino al 90% a seconda del tipo di dati in questione. I dati vengono memorizzati come tipo di dati VARBINARY(MAX)
:
INSERT INTO dbo.Table1 (Col1, Col2) VALUES ('C0001', COMPRESS('<long string goes here>'));
DECOMPRESS
viene utilizzato per leggere di nuovo i dati:
SELECT Col1, DECOMPRESS(Col2) AS Col2 FROM dbo.Table1 WHERE Col1 = 'C0001';
Dove lo userei?
Questo è ottimo per tenere traccia dei dati LOB che non devono essere interrogati spesso, ad esempio stringhe di grandi dimensioni contenenti testo JSON e XML. Come notato in un post precedente, il tipo di dati XML potrebbe non essere appropriato ai fini del controllo perché modifica in modo permanente i dati, mentre COMPRESS
sarebbe un meccanismo di archiviazione appropriato perché i dati sono esattamente gli stessi quando vengono letti di nuovo.
Ci sono delle limitazioni?
Non è possibile indicizzare i dati compressi, perché sono memorizzati come array di byte compressi. Se si desidera creare un indice, è possibile utilizzare la compressione di riga o pagina e sperare per il meglio, oppure utilizzare una colonna calcolata contenente i dati necessari dalla colonna e indicizzarli.