2011-03-11 68 views
2

我们的应用程序根据客户端配置的规则结构来处理数据。 在处理期间,每一步都会生成详细的“日志”,以便用户能够理解最终处理结果背后的逻辑原因......以及什么限制(或规则或其他)发挥作用。压缩SQL的冗余文本数据。一个固定字典?

如何将这些数据存储在数据库中?

我敢打赌,95%以上的数据从一个日志记录到下一个日志记录是多余的。我在100条记录的合并文本上运行了LZMA,输出大小为2%。

仅通过主键检索文本。从不查询过滤或搜索目的。 每条记录​​的文本平均值大约为25k。

如果我压缩每条记录的文本,我将处于〜10%的压缩率...对比2%的压缩率(对于组合的100条记录)。

理想情况下,我想使用某种从大量现有数据生成的固定字典。

我们正在使用SQL 2005.我知道SQL 2008有行&页面级压缩选项..但是让我们的整个客户端升级是不可行的。

想法? 谢谢!


更新:这是我所做的。 经过一个星期的阅读实验后,我编写了一个程序,在1000条记录的组合文本上生成一个LZW样式的字符串字典。然后,我以各种方式优先处理字典,包括: - 总体预期节省(以字节为单位,通过替换) - 预期节省,仅包含字典条目,每条记录的出现次数为1次或更少。

我在示例Record上运行了最高优先级X(100 & 1000之间)字典条目的简单替换。然后使用LZMA alg。压缩编码输出。

通过播放字典的不同配置...我发现充其量,我可以将LZMA压缩提高约1%。在大多数情况下,我引入比我拉出来的更多的熵,因此编码的LZMA压缩数据比原始数据压缩w/LZMA大

我已经确定每个记录的文本中有更多的可以被LZMA利用的冗余,而不是行之间的冗余。

所以很有可能,我只需要LZMA所有的文本,并称它为一天。

+0

+1很好的问题! – 2011-03-11 02:29:49

+0

是重新使用的日志的整个行?或者是否有大致相同的细微差别?换句话说,是否有机会重复使用从一个日志条目到另一个日志条目的相同确切文本? – Randy 2011-03-11 02:33:25

+0

大部分相同的文字..有一些差异。例如,每个记录可能有如下行:“计算2008年的年限:$ xx.xx找到”或“每月最低<300美元。处理中止”。日期,美元,中止/继续会改变。 – 2011-03-11 02:58:40

回答

1

我可以想到在SQL 2005中完成这种类型的压缩的唯一方法是使用您自己的SQL CLR对象创建一个自定义框架。这将是一个非常复杂的解决方案,但它可能适用于您的目的。升级到SQL 2008可能会更容易,更经济。

SQL CLR函数和/或触发器可以用来管理压缩&有关表上的解压缩操作......性能可能不如最佳,我不知道。你还需要某种字典管理工具。可能会创建某种计划维护,负责定期更新和优化固定字典(如果需要)。

虽然这不是直接解决您的问题,我认为你可能会发现代码项目有趣下面的文章 -

Using CLR integration to compress BLOBs/CLOBs in SQL Server 2005

正如你可以看到,文章的作者使用SQL CLR以一种非常聪明的方式解决SQL 2005上不同的压缩问题。

+0

感谢您的想法。我从来没有真正在SQL中使用CLR ......我会试着去探索它。谢谢! – 2011-03-16 16:42:19

0

如果它大部分是相同的文本,也许可以采取更多的关系方法来将消息输出的范围存储在数据库中,并且使用messageID和使消息唯一的不同参数来创建表格?

+0

如果我是从头开始设计的,我绝对会考虑数据规范化和其他开明的设计选择。我遗憾地继承了一个基本上允许任意文本的实现。 – 2011-03-11 03:32:35