Estoy tratando de comprimir algunas tablas que tienen NVARCHAR(MAX)
campos. Por desgracia, el row
y la page
compresión no tienen el impacto deseo (sólo ~ 100/200 MB guarda para 20 GB de mesa). Además, no puedo aplicar compresiones de archivo de almacén de columna y de almacén de columna porque no admiten la compresión de NVARCHAR(MAX)
campos.
¿Alguien puede saber si tengo alguna alternativa aquí?
También supongo que la compresión row
y page
no tienen efecto porque el contenido de las NVARCHAR(MAX)
columnas es único.
VARCHAR
posible pérdida de datos si se utilizan caracteres de más de 1 página de códigos? Creo que el consejo debería ser convertir aNVARCHAR(4000)
si la longitud máxima no es mayor a 4000 porque entonces todos los valores serían elegibles para la compresión Unicode completa. Aún así, probablemente sea seguro suponer a partir de la información en la Pregunta que los valores tienen más de 4000 caracteres, por lo que actualmente no se están comprimiendo.Respuestas:
La compresión de páginas y filas no comprime BLOB .
Si desea comprimir BLOB, debe almacenarlos
VARBINARY(MAX)
y aplicar el algoritmo de compresión de flujo que prefiera. Por ejemploGZipStream
. Hay muchos ejemplos de cómo hacer esto, solo busque GZipStream y SQLCLR.fuente
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:
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
ypage
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 unVARBINARY
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 losNVARCHAR
datos.fuente