got*_*tqn 15 sql-server compression sql-server-2014
我正在尝试压缩一些具有NVARCHAR(MAX)
字段的表。不幸的是,压缩row
和page
压缩没有预期的影响(对于 20 GB 表仅节省了大约 100/200 MB)。此外,我无法应用列存储和列存储归档压缩,因为它们不支持NVARCHAR(MAX)
字段压缩。
谁能告诉我这里是否有其他选择?
我也猜测row
和page
压缩没有效果,因为NVARCHAR(MAX)
列的内容是唯一的。
Rem*_*anu 17
页和行压缩都不压缩 BLOB。
由于它们的大小,大值数据类型有时与特殊用途页面上的普通行数据分开存储。数据压缩不适用于单独存储的数据。
如果您想压缩 BLOB,您需要将它们存储为VARBINARY(MAX)
并应用您选择的流压缩算法。例如GZipStream
。有很多示例如何执行此操作,只需搜索 GZipStream 和 SQLCLR。
Sol*_*zky 11
有(现在)可能有两种方法来完成自定义压缩:
从 SQL Server 2016 开始,有用于COMPRESS 的内置函数和DECOMPRESS 的。这些函数使用 GZip 算法。
使用 SQLCLR 实现您选择的任何算法(如@Remus 在他的回答中提到的)。此选项在 SQL Server 2016 之前的版本中可用,一直追溯到 SQL Server 2005。
GZip 是一个简单的选择,因为它在 .NET和受支持的 .NET Framework 库中可用(代码可以在程序集中SAFE
)。或者,如果您想要 GZip 但不想处理编码/部署它,您可以使用Util_GZip和Util_GUnzipSQL# SQLCLR 库(我是其作者)的免费版本中提供函数。
如果您决定使用 GZip,无论您自己编写代码还是使用 SQL#,请注意 .NET 中用于执行 GZip 压缩的算法在 Framework 4.5 版中变得更好(请参阅 MSDN 上的“备注”部分GZipStream 类的页面)。这意味着:
但是,您不必使用 GZip 并且可以自由地实现任何类似的算法。
请注意:上面提到的所有方法更像是“变通方法”,而不是实际替换,即使它们在技术上是“压缩 NVARCHAR(MAX)”数据的替代方法。不同之处在于使用内置数据压缩 --row
和page
-由SQL Server提供的,压缩幕后的处理,数据仍然是可用的,可读的,并编入索引。但是将任何数据压缩成一种VARBINARY
意味着您节省了空间,但放弃了一些功能。确实,一个 20k 的字符串无论如何都不可索引,但它仍然可以用于WHERE
子句,或任何字符串函数。为了对自定义压缩值执行任何操作,您需要即时解压缩它。压缩二进制文件(PDF、JPEG 等)时,这不是问题,但此问题特定于NVARCHAR
数据。
归档时间: |
|
查看次数: |
12167 次 |
最近记录: |