J'essaie de compresser certaines tables qui ont des champs NVARCHAR(MAX)
. Malheureusement, la compression row
et page
n'a pas l'impact souhaité (seulement ~ 100/200 Mo économisés pour une table de 20 Go). De plus, je ne suis pas en mesure d'appliquer des compressions d'archivage de magasin de colonnes et de magasins de colonnes car elles ne prennent pas en charge la compression des champs NVARCHAR(MAX)
.
Quelqu'un peut-il dire si j'ai des alternatives ici?
Je suppose également que la compression row
et page
n'a pas d'effet car le contenu des colonnes NVARCHAR(MAX)
est unique.
Compression des pages et des lignes ne pas compresser les BLOBs .
En raison de leur taille, les types de données de grande valeur sont parfois stockés séparément des données de ligne normales sur des pages spéciales. La compression des données n'est pas disponible pour les données stockées séparément.
Si vous souhaitez compresser des BLOB, vous devez les stocker sous VARBINARY(MAX)
et appliquer l'algorithme de compression de flux de votre choix. Par exemple GZipStream
. Il existe de nombreux exemples pour ce faire, recherchez simplement GZipStream et SQLCLR.
Il existe (maintenant) potentiellement deux façons d'effectuer une compression personnalisée:
À partir de SQL Server 2016, il existe des fonctions intégrées pour COMPRESSER et DÉCOMPRESSER . Ces fonctions utilisent l'algorithme GZip.
Utilisez SQLCLR pour implémenter n'importe quel algorithme que vous choisissez (comme @Remus l'a mentionné dans sa réponse). Cette option est disponible dans les versions antérieures à SQL Server 2016, remontant jusqu'à SQL Server 2005.
GZip est un choix facile car il est disponible dans .NET et dans les bibliothèques .NET Framework prises en charge (le code peut être dans un SAFE
Assembly). Ou, si vous voulez GZip mais ne voulez pas le coder/le déployer, vous pouvez utiliser les Util_GZip et Fonctions Util_GUnzip disponibles dans la version gratuite de la bibliothèque SQL # SQLCLR (dont je suis l'auteur).
Si vous décidez d'utiliser GZip, que vous le codiez vous-même ou que vous utilisiez SQL #, sachez que l'algorithme utilisé dans .NET pour effectuer la compression GZip a été amélioré dans Framework version 4.5 (voir la section "Remarques" sur le MSDN page pour classe GZipStream ). Ça signifie:
Cependant, vous n'avez pas à utiliser GZip et êtes libre d'implémenter n'importe quel algorithme comme.
S'IL VOUS PLAÎT NOTE: toutes les méthodes indiquées ci-dessus sont plus des "contournements" au lieu d'être des remplacements réels, même si elles sont techniquement "des moyens compresser les données NVARCHAR (MAX) ". La différence est qu'avec la compression de données intégrée - row
et page
- offerte par SQL Server, la compression est gérée en arrière-plan et les données sont toujours utilisables, lisibles et indexable. Mais la compression de toutes les données dans un VARBINARY
signifie que vous économisez de l'espace, mais abandonnez certaines fonctionnalités. Certes, une chaîne de 20 Ko n'est pas indexable de toute façon, mais elle peut toujours être utilisée dans une clause WHERE
, ou avec n'importe quelle fonction de chaîne. Pour faire quoi que ce soit avec une valeur compressée personnalisée, vous devez la décompresser à la volée. Lors de la compression de fichiers binaires (PDF, JPEG, etc.), ce n'est pas un problème, mais cette question était spécifique aux données NVARCHAR
.