Hay (ahora) potencialmente dos formas de lograr una compresión personalizada:
A partir de SQL Server 2016, hay funciones integradas para COMPRESS y DECOMPRESS . Estas funciones usan el algoritmo GZip.
Use SQLCLR para implementar cualquier algoritmo que elija (como @Remus mencionó en su respuesta). Esta opción está disponible en versiones anteriores a SQL Server 2016, desde SQL Server 2005.
GZip es una opción fácil porque está disponible dentro de .NET y en las bibliotecas compatibles de .NET Framework (el código puede estar en un SAFE
ensamblado). O, si desea GZip pero no quiere ocuparse de codificarlo / implementarlo, puede usar las funciones Util_GZip y Util_GUnzip que están disponibles en la versión gratuita de la biblioteca SQL # SQLCLR (de la que soy autor).
Si decide usar GZip, ya sea que lo codifique usted mismo o use SQL #, tenga en cuenta que el algoritmo utilizado en .NET para hacer la compresión GZip cambió en Framework versión 4.5 para mejor (consulte la sección "Comentarios" en el MSDN página para la clase GZipStream ). Esto significa:
- Si está utilizando SQL Server 2005, 2008 o 2008 R2, todos vinculados a CLR v 2.0 que maneja las versiones de Framework 2.0, 3.0 y 3.5, entonces el cambio realizado en la versión 4.5 de Framework no tiene efecto y desafortunadamente está atascado con Algoritmo original y desagradable de .NET.
- Si está utilizando SQL Server 2012 o más reciente (hasta ahora 2014 y 2016), todos vinculados a CLR v 4.0 que maneja las versiones de Framework 4.0, 4.5.x, 4.6, puede usar el algoritmo más nuevo y mejor. El único requisito es que haya actualizado .NET Framework en el servidor que ejecuta SQL Server para que sea la versión 4.5 o posterior.
Sin embargo, no tiene que usar GZip y es libre de implementar cualquier algoritmo como.
TENGA EN CUENTA: todos los métodos mencionados anteriormente son más "soluciones" en lugar de ser reemplazos reales, a pesar de que técnicamente son "formas alternativas de comprimir datos NVARCHAR (MAX)". La diferencia es que con la compresión de datos incorporada row
y page
ofrecida por SQL Server, la compresión se maneja detrás de escena y los datos aún son utilizables, legibles e indexables. Pero comprimir cualquier dato en un VARBINARY
medio significa que está ahorrando espacio, pero renunciando a alguna funcionalidad. Es cierto que una cadena de 20k no es indexable de todos modos, pero aún se puede usar en unWHERE
cláusula, o con cualquier función de cadena. Para hacer cualquier cosa con un valor comprimido personalizado, necesitaría descomprimirlo sobre la marcha. Al comprimir archivos binarios (PDF, JPEG, etc.) esto no es un problema, pero esta pregunta era específica de los NVARCHAR
datos.