Articles

Compressione in SQL Server: COMPRIMERE e DECOMPRIMERE

Posted by admin

Su Twitter di recente, ho chiesto:

Qualcuno che conosco usa le funzionalità COMPRESS e DECOMPRESS in T-SQL?

A coloro che hanno risposto affermativamente, ho chiesto:

Cosa ti ha fatto decidere su questo in contrasto con la compressione ROW o PAGE?

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.

Related Post

Leave A Comment