3

背景

我们的一个 SQL Server 2012 数据库变得有点大,至少与我们的其他数据库相比是这样。我正在运行一些查询,并注意到我们当前在其中一列中存储了大量的 xml/html 数据。这是影响数据库大小的主要因素。

我突然想到,可以先压缩此列中的数据,然后再将其存储在 C# 中。我发现这些我能够验证的压缩方法可以正常工作。

在我的测试中,在 C# 中对一个 20,000 个字符的 html 字符串进行压缩和解压缩花费了千分之 1-3 秒,并且解压缩时间相似。

所以,我的想法是在 C# 中压缩和解压缩 xml/html 字符串将具有以下优点:

  1. 减少传输到数据库的数据量
  2. 减少了数据库中所需的存储量。
  3. 减少从数据库传输的数据量。

所有这些只会抵消我在网络服务器上压缩和解压缩的千分之几秒。

问题

采用我需要注意的这种策略是否有任何陷阱?

4

2 回答 2

1

这会奏效,是的。链接的代码有两个问题:

  1. 它使用Unicode对常见字符集浪费的编码。使用UTF8.
  2. 众所周知,BCL 压缩机性能很差。尝试使用更好的库,例如 SharpZipLib。如果您想将大量 CPU 用于非常小,请使用 LZMA(提供免费 C# 代码)。它是最先进的(主流)压缩。

请注意,SQL Server 的数据压缩功能不会影响 blob,因此它不能作为替代方案。AFAIK 它也不会压缩单个字符串中的冗余。它只压缩字符串中的公共前缀。不过,不确定。

如果您要一次压缩多个 blob,您将获得更好的压缩效果。但是,这不允许采用逐行方法。

于 2013-09-23T14:20:52.423 回答
1

由于您使用的是 SQL Server 2012,因此您可以对相关表启用行级或页级压缩。这提供了透明的压缩,使您能够专注于客户端的需求而不是存储系统的需求。

微软在http://technet.microsoft.com/en-us/library/cc280449.aspx上有一个很好的压缩文档

ALTER TABLE <table_name> 
REBUILD 
WITH (DATA_COMPRESSION = PAGE | ROW)

压缩的一个相当重要的好处是减少了 SQL Server 上的内存使用。压缩数据库中的数据页面也会导致页面在内存中保持压缩状态。

Glenn Berry 在http://www.sqlskills.com/blogs/glenn/estimating-data-compression-savings-in-sql-server-2012/上有一篇关于估计压缩好处的优秀文章

于 2013-09-23T14:12:52.583 回答