2012-04-09 86 views
0

我使用的是OLAP系統,其中一些表格有文本字段。文本長度可以從一些字節到KB,而一行中的其他修訂大小字段的大小隻有大約100字節。如何減少數據庫中文本字段的數據冗餘

我的一些表格有數十億行,文本字段的值是高度可重複的,我如何減少這種冗餘來節省存儲空間並且不會丟失查詢性能?

回答

1

冗餘是數據庫工作中的一個術語。這並不意味着「重複」。這意味着「不必要的重複」。你可能沒有任何不必要的重複;爲了向用戶傳達正確的含義,每個值在其自己的行中都是必需的。

有時候,您可以用較短的人類可讀代碼替換現有的值。較短的代碼會生成較窄的表,這意味着數據庫中的每頁更多行以及更快的I/O。例如,在美國,我們經常使用兩個字母的郵政編碼來代替州的全名。這幾乎總是有效的。 (這意味着人們可以在不進行進一步處理的情況下讀取輸出,並且查詢的運行速度至少快一些。)

有時,您可以用代理鍵替換現有的值,希望額外聯接的成本會超過更快磁盤I/O。有時這種戰術不會工作;您需要測試並準備好恢復到原始模式。

+0

謝謝,其實,我的價值觀是一些URL字符串,它會以低頻率重複,例如每次10到100次(不如郵編)。我想減少它們的原因是這些值佔據了我的大部分存儲空間,這意味着如果我可以減少重複值融入其中,它將節省高達80%的磁盤空間。 我試圖使用一個鍵值存儲,就像您說的那樣,並且在查詢進來時確實加入了這個存儲。但是它導致大量隨機訪問用於添加鍵值存儲,這使得查詢性能下降很多。有沒有我可以在這裏做的優化工作? – Shawn 2012-04-10 03:06:03

+0

a)要縮短網址,您可以使用[tinyurl](http://tinyurl.com/),[bitly](https://bitly.com/)或[Google網址縮短器](http://goo.gl/)。 b)你可能只需要替換「http:// www.'就可以了。一個不以'http:// www.'開頭的URL需要在輸出時加上該字符串。 – 2012-04-10 07:47:24

0

報告數據庫中的URL導致了我以前的麻煩。可能值得嘗試的是將URL拆分爲3個部分 - 主機名/端口,路徑& querystring - 您最終可能會得到一個url-fragment表(可能不止一個)和一個帶有FK的URL表 - 片段表。有時查詢字符串不值得單獨存儲,在這種情況下,URL表具有用於主機名&路徑的FK,並存儲查詢字符串。

另一個想法是刪除querystring中無用的部分 - 這個決定需要在逐個應用程序的基礎上發生,但可以產生很大的變化 - 從URL中刪除會話ID可以顯着改善事情(也可以大概可以砍出谷歌分析參數。

而且,只有當你需要訪問URL表,並確保你至少擁有主機名的索引。