压缩 NVARCHAR(MAX) 的替代方法?

got*_*tqn 15 sql-server compression sql-server-2014

我正在尝试压缩一些具有NVARCHAR(MAX)字段的表。不幸的是,压缩rowpage压缩没有预期的影响(对于 20 GB 表仅节省了大约 100/200 MB)。此外,我无法应用列存储和列存储归档压缩,因为它们不支持NVARCHAR(MAX)字段压缩。

谁能告诉我这里是否有其他选择?

我也猜测rowpage压缩没有效果,因为NVARCHAR(MAX)列的内容是唯一的。

Rem*_*anu 17

页和行压缩都不压缩 BLOB

由于它们的大小,大值数据类型有时与特殊用途页面上的普通行数据分开存储。数据压缩不适用于单独存储的数据。

如果您想压缩 BLOB,您需要将它们存储为VARBINARY(MAX)并应用您选择的流压缩算法。例如GZipStream。有很多示例如何执行此操作,只需搜索 GZipStream 和 SQLCLR。


Sol*_*zky 11

有(现在)可能有两种方法来完成自定义压缩:

  1. 从 SQL Server 2016 开始,有用于COMPRESS 的内置函数DECOMPRESS 的。这些函数使用 GZip 算法。

  2. 使用 SQLCLR 实现您选择的任何算法(如@Remus 在他的回答中提到的)。此选项在 SQL Server 2016 之前的版本中可用,一直追溯到 SQL Server 2005。

    GZip 是一个简单的选择,因为它在 .NET受支持的 .NET Framework 库中可用(代码可以在程序集中SAFE)。或者,如果您想要 GZip 但不想处理编码/部署它,您可以使用Util_GZipUtil_GUnzipSQL# SQLCLR 库(我是其作者)的免费版本中提供函数。

    如果您决定使用 GZip,无论您自己编写代码还是使用 SQL#,请注意 .NET 中用于执行 GZip 压缩的算法在 Framework 4.5 版中变得更好(请参阅 MSDN 上的“备注”部分GZipStream 类的页面)。这意味着:

    1. 如果您使用的是 SQL Server 2005、2008 或 2008 R2——所有这些都链接到处理框架版本 2.0、3.0 和 3.5 的 CLR v 2.0——那么框架版本 4.5 中所做的更改没有任何效果,不幸的是你被困在了.NET 的原始算法。
    2. 如果您使用的是 SQL Server 2012 或更新版本(截至 2014 年和 2016 年)——都链接到处理框架版本 4.0、4.5.x、4.6 的 CLR v 4.0——那么您可以使用更新、更好的算法。唯一的要求是您已将运行 SQL Server 的服务器上的 .NET Framework 更新为 4.5 或更高版本。

    但是,您不必使用 GZip 并且可以自由地实现任何类似的算法。

请注意:上面提到的所有方法更像是“变通方法”,而不是实际替换,即使它们在技术上是“压缩 NVARCHAR(MAX)”数据的替代方法。不同之处在于使用内置数据压缩 --rowpage-由SQL Server提供的,压缩幕后的处理,数据仍然是可用的,可读的,并编入索引。但是将任何数据压缩成一种VARBINARY意味着您节省了空间,但放弃了一些功能。确实,一个 20k 的字符串无论如何都不可索引,但它仍然可以用于WHERE子句,或任何字符串函数。为了对自定义压缩值执行任何操作,您需要即时解压缩它。压缩二进制文件(PDF、JPEG 等)时,这不是问题,但此问题特定于NVARCHAR数据。