Sur Twitter récemment, j’ai demandé:
Quelqu’un que je connais utilise-t-il les fonctionnalités
COMPRESS
etDECOMPRESS
de T-SQL ?
À ceux qui ont répondu par l’affirmative, j’ai demandé:
Qu’est-ce qui vous a fait décider à ce sujet par opposition à la compression
ROW
ouPAGE
?
Joey D’Antoni (blog|Twitter), l’un de mes co-auteurs, m’a rappelé que la compression de lignes et de pages ne fonctionne pas sur les données LOB (« gros objet »). Dave Dustin (Twitter) et Niko Neugebauer (blog | Twitter) ont déclaré qu’ils utilisaient spécifiquement COMPRESS
pour les données LOB pour cette raison.
Modifications du code
L’utilisation de ces fonctions nécessite des modifications du code existant car vous devez utiliser la fonction COMPRESS
lors de l’insertion de données. Dave et Niko l’ont fait en cachant la fonctionnalité à l’intérieur des vues.
Si vous ne pouvez pas modifier le code de votre environnement, vous devrez peut-être recourir à la compression de lignes et de pages, ou éventuellement à des index columnstore.
Comment ça marche ?
Publié avec SQL Server 2016, COMPRESS
exploite l’algorithme de compression gzip open source et peut réduire l’espace utilisé jusqu’à 90% selon le type de données en question. Les données sont stockées en tant que type de données VARBINARY(MAX)
:
INSERT INTO dbo.Table1 (Col1, Col2) VALUES ('C0001', COMPRESS('<long string goes here>'));
DECOMPRESS
est utilisé pour relire les données:
SELECT Col1, DECOMPRESS(Col2) AS Col2 FROM dbo.Table1 WHERE Col1 = 'C0001';
Où l’utiliserais-je?
Ceci est idéal pour garder une trace des données LOB qui n’ont pas besoin d’être souvent interrogées, par exemple de grandes chaînes contenant du texte JSON et XML. Comme indiqué dans un article précédent, le type de données XML peut ne pas être approprié à des fins d’audit car il modifie en permanence les données, alors que COMPRESS
serait un mécanisme de stockage approprié car les données sont exactement les mêmes lorsqu’elles sont lues à nouveau.
Y a-t-il des limitations?
Vous ne pouvez pas indexer les données compressées, car elles sont stockées sous forme de tableau d’octets compressés. Si vous souhaitez créer un index, vous pouvez soit utiliser la compression de ligne ou de page et espérer le meilleur, soit utiliser une colonne calculée contenant les données dont vous avez besoin de la colonne, et l’indexer à la place.