【问题标题】:Column level compression in SQL ServerSQL Server 中的列级压缩
【发布时间】:2012-01-27 18:21:14
【问题描述】:

我有一个列,我想在(XML 数据)中存储大量文本数据。每行大约 8,000 个字符,每分钟大约 100-500 行。

这么多数据意味着我将不得不相当积极地清除该列。 (由于我必须在我们公司的 SAN 上托管我的 SQL Server,存储空间非常昂贵。)但如果我能找到一种方法来压缩这些数据,我可以将其保存更长时间。 p>

我在 SQL 2005 的 using CLR Integration to compress BLOBs 上看到过类似这篇文章的内容。

我还看到了用于 SQL Server 2005 的工具 SQLCompress.NET

两者似乎都说他们完全按照我的意愿行事。在存储时压缩单个列的数据。

但是,该工具已被废弃(自 2008 年以来没有更新),我对 CLR 集成知之甚少,除了听说它会导致问题。 此外,这两种解决方案都适用于 SQL Server 2005。

所以,这是我的问题。我正在使用 SQL Server 2008 R2。这些 SQL Server 2005 解决方案中的任何一个都适合我吗?

或者我可以使用其他解决方案来压缩我的数据吗?

注意:行压缩和页面压缩对我需要的东西没有帮助(至少据我所知。)行压缩将固定长度的数据存储在可变长度字段中,页面压缩减少了冗余数据的实例。这些都对大文本块没有帮助。

注意二:我看到了这个question,但它的答案使用了行和页面压缩或文件流。我不想使用 FILESTREAM,因为我失去了镜像数据库的能力。

【问题讨论】:

  • 您使用什么将数据写入(和读取)SQL Server?一些 C# 应用程序?
  • 我无法真正回答您的问题,但始终有效的替代方法是让客户端应用程序压缩数据。您将存储一个 varbinary(max) blob。您可以使用任何您想要的压缩库,包括强大的压缩库,例如 7-zip (LZMA SDK)。我猜这些在 SQL Server 中不起作用。
  • @ChrisShain - 我正在使用 C# 应用程序(IIS 中托管的 WCF/NServiceBus)对其进行写入。我使用 SSMS 读取它。
  • 我已经想到了。但后来我无法使用 SSMS 查询数据。我总是需要一个自定义应用程序来查看数据。尽管如此,这还是可行的,如果我找不到更好的方法,我最终可能会这样做。
  • 考虑到当前的两个答案,有人可以评论“我对 CLR 集成了解不多,除非我听说它会导致问题”?我最近自己使用了 CLR 集成(我承认对它了解不多),没有任何问题。

标签: .net sql-server sql-server-2008 sql-server-2008-r2 data-compression


【解决方案1】:

我认为最好的选择是使用客户端库在将数据放入 SQL Server 之前对其进行压缩和解压缩,如果您想通过 XML 的特定元素或属性进行查询,您可以提取那些并将它们存储在单独的列或规范化的行中(无论如何您都希望这样做——查询大型 XML 文本列,尤其是对于嵌套元素,是 slow)。

【讨论】:

  • 我不需要在 XML 内部进行查询,只需在 SSMS 查询中获取整个 XML。 (就像它是普通的文本数据一样。)我宁愿不在客户端压缩,因为那样我就不能使用 SSMS 来查看数据。使用 CLR 集成的列级压缩是个坏主意吗?这是 SQL Server 不常见的领域吗?
  • 客户端压缩解压时。不如 SQL Server 中的列压缩好,但我会尽我所能。
【解决方案2】:

您可以尝试使用 filestream 来存储 xml 文档并使用 NTFS 来压缩它们。

看这篇文章

Using Filestream in SQL2008

【讨论】:

  • 唉,当您使用 FileStream 时,您失去了镜像数据库的能力。这是我的 DBA 需要的功能。否则我可能会选择这个解决方案。
猜你喜欢
  • 1970-01-01
  • 2019-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多