2013-09-23 76 views
3

背景僱用,以字符串壓縮減小數據庫大小

一個我們的SQL Server 2012和數據庫是有點大任何可能存在的缺陷,至少比我們的其他數據庫。我正在運行一些查詢,並注意到我們正在其中一列中存儲大量的xml/html數據。這是數據庫規模的主要貢獻者。

在我看來,這一列中的數據可以在存儲到C#之前被壓縮。我發現我能夠驗證的these compression methods會正常工作。

在我的測試中,C#中的一個20,000字符的html字符串的壓縮和解壓縮花費了千分之一秒,並且解壓時間相似。

所以,我的想法是,壓縮和解壓在C#中的XML/HTML字符串將具有以下優點:

  1. 減少數據量傳輸到數據庫所需的存儲
  2. 量減少數據庫。
  3. 減少從數據庫傳輸的數據量。

所有這些只會抵消我在千萬分之一秒的Web服務器上的壓縮和解壓縮。

問題

是否有任何陷阱,以採用這種策略,我需要注意的?

+1

我不介意downvote,但會很感激評論,我應該去哪裏回答這個問題。 – Narnian

+1

除了額外的複雜程度和無法使用其他工具(如SSMS)閱讀文本之外。但如果這些問題對你來說不是問題,那麼我看不出有什麼理由不這樣做。 – Pete

+3

根據SQL Server的版本,可以使用它的本機壓縮。這會將Web服務器的工作負載放在SQL Server上 - 這是否有用取決於每臺計算機的工作負載。 –

回答

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上的內存使用情況。壓縮數據庫中的數據頁面也會導致頁面在內存中保持壓縮狀態。

格倫·貝瑞在http://www.sqlskills.com/blogs/glenn/estimating-data-compression-savings-in-sql-server-2012/

+0

不影響blob,唉。 – usr

1

這對估計壓縮的好處的優秀文章將工作,是的。鏈接的代碼有兩個問題:

  1. 它使用Unicode編碼這是浪費的普通字符集。使用UTF8
  2. BCL壓縮機已知是非常差差。試用更好的庫,比如SharpZipLib。如果你想花很多CPU去做很小的事情,可以使用LZMA(免費的C#代碼)。這是最先進的(主流)壓縮技術。

請注意,SQL Server的數據壓縮功能不會影響blob,因此它不能作爲替代選擇。 AFAIK它也不會壓縮單個字符串內的冗餘。它只壓縮跨字符串的通用前綴。但是不確定。

如果您要一次壓縮多個blob,您將獲得更好的壓縮。雖然這不會允許逐行方法。

+0

OP僅詢問關於在SQL Server中可以壓縮的HTML /文本數據。 –

+0

@MaxVernon它可以通過數據壓縮功能進行壓縮? SQL Server數據壓縮不使用像LZ這樣的通用算法。這是非常特殊的目的。以下是一些詳細信息:http://technet.microsoft.com/en-us/library/cc280464.aspx http://sqlblog.com/blogs/hugo_kornelis/archive/2013/01/31/why-does-sql- server-not-compress-data-on-lob-pages.aspx後者也解釋了爲什麼頁面壓縮不能用於blob。我想這是值得一試的。 – usr

+0

我建議您運行sp_estimate_data_compression_savings stored proc來估計任何給定表的節省額。 –