2011-03-11 43 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