SQL Server 2008數(shù)據(jù)壓縮的正確執(zhí)行
下面的文章主要介紹的是正確執(zhí)行SQL Server 2008數(shù)據(jù)壓縮的實(shí)際操作流程,在實(shí)際操作中我們對(duì)SQL Server 2008數(shù)據(jù)庫的新功能進(jìn)行觀察時(shí),我們發(fā)現(xiàn)一個(gè)叫做數(shù)據(jù)壓縮的可能很有趣的功能,我們可以用這個(gè)功能來縮小表,索引或者它們分區(qū)的一個(gè)子集。
您能給我們提供如何利用這個(gè)新功能的詳細(xì)解釋嗎?
專家解答
在SQSQL Server 2008數(shù)據(jù)壓縮在SQL Server 2005 的Service Pack 2中已經(jīng)可以使用了,在Service Pack 2中,引進(jìn)了存儲(chǔ)小數(shù)和數(shù)字?jǐn)?shù)據(jù)。Vardecimal存儲(chǔ)格式允許小數(shù)和數(shù)字?jǐn)?shù)據(jù)類型以變長的形式存儲(chǔ)。這個(gè)概念在SQL Server 2008中被擴(kuò)展成全部定長的數(shù)據(jù)類型,比如integer,char和float 數(shù)據(jù)類型。數(shù)據(jù)壓縮通過減少I/O和提高緩沖區(qū)命中率來降低儲(chǔ)存成本和提高查詢性能。
SQL Server 2008在表級(jí)別和索引級(jí)別上支持行和頁的壓縮。以下是兩種類型的SQL Server 2008數(shù)據(jù)壓縮的不同之處。
行壓縮(ROW Compression) 這種壓縮功能考慮到變長數(shù)據(jù)類型結(jié)構(gòu)來定義一欄。比如,以變長存儲(chǔ)的一個(gè)CHAR(100)欄只能使用由數(shù)據(jù)定義的存儲(chǔ)空間大小。在欄中存儲(chǔ)“SQL Server 2008”只要求存儲(chǔ)15個(gè)字符而不是完整的100個(gè)字符,因此,在存儲(chǔ)空間上節(jié)省率為85%。
這是在SQL Server 2005 Service Pack 2中可以使用的 vardecimal存儲(chǔ)格式的擴(kuò)展。還要注意到,這個(gè)壓縮功能沒有因?yàn)榱慊蛘呖罩刀加么疟P空間。
頁級(jí)別壓縮(PAGE Compression) 這種壓縮功能是行壓縮的父集,它考慮到給定的頁內(nèi)的一行或多行冗余數(shù)據(jù)。它也使用前綴和字典壓縮。這僅僅意味著對(duì)于兩種頁壓縮技術(shù),存儲(chǔ)引擎在頁內(nèi)減少重復(fù)數(shù)據(jù)。
比如,如果利用一列前綴把一張表分區(qū),在一個(gè)具體分區(qū)中的所有數(shù)據(jù)都會(huì)有一樣或者相似的前綴。讓我們以一些像A1000Q-xxxx的產(chǎn)品代碼為開始說一些欄的值,存儲(chǔ)引擎存儲(chǔ)A1000Q – 一開始在頁上接著在相同的頁面上從這個(gè)值的其他所有的發(fā)生的事指到這個(gè)值。這也可以說成有已經(jīng)定義好的默認(rèn)約束的一欄。頁壓縮只發(fā)生在頁已經(jīng)完全優(yōu)化性能的時(shí)候。
雖然表面看來數(shù)據(jù)壓縮會(huì)縮小你的表和索引,但是最好首先通過
sp_estimate_data_compression_savings系統(tǒng)存儲(chǔ)程序或數(shù)據(jù)壓縮Wizard工具在表或索引中評(píng)估預(yù)計(jì)的節(jié)省空間。你也可能檢查現(xiàn)有數(shù)據(jù)是否成為碎片,因?yàn)槟憧赡芸梢酝ㄟ^重建它而不是使用壓縮來縮小索引。
評(píng)估存儲(chǔ)節(jié)省空間
我們可以使用sp_estimate_data_compression_savings系統(tǒng)存儲(chǔ)程序或者SQL Server 2008數(shù)據(jù)壓縮Wizard工具去為索引中的一張表找出預(yù)計(jì)的存儲(chǔ)節(jié)省空間。為了使用AdventureWorks數(shù)據(jù)庫中的
sp_estimate_data_compression_savings系統(tǒng)存儲(chǔ)程序,
- USE AdventureWorks
- GO
- EXEC sp_estimate_data_compression_savings 'Sales', 'SalesOrderDetail', NULL, NULL, 'ROW' ;
- GO
在這里,
l 第一個(gè)參數(shù)是模式名,
l 第二個(gè)參數(shù)是對(duì)象名,
l 第三個(gè)參數(shù)是索引id,
l 第四參數(shù)是分區(qū)id,
l 最后一個(gè)參數(shù)是壓縮類型。
在以上的例子中,我會(huì)考慮在AdventureWorks數(shù)據(jù)庫中的Sales.SalesOrderDetail表上的行壓縮。執(zhí)行這個(gè)查詢會(huì)給你如下顯示的結(jié)果:
請(qǐng)注意欄size_with_current_compression_setting(KB)和
size_with_requested_compression_setting (KB),假設(shè)沒有碎片,這兩個(gè)欄會(huì)讓你對(duì)在Sales.SalesOrderDetail表中實(shí)現(xiàn)節(jié)省空間有個(gè)估計(jì)。
要使用數(shù)據(jù)壓縮Wizard工具,右鍵單擊Sales.SalesOrderDetail表,選擇存儲(chǔ)并且單擊管理壓縮?!?/p>
這將在Welcome to Data Compression Wizard上啟動(dòng)SQL Server 2008數(shù)據(jù)壓縮Wizard工具,點(diǎn)擊下一步。
在選擇壓縮類型頁面上,在壓縮類型欄里點(diǎn)擊下拉菜單,選擇你的壓縮類型選項(xiàng)。我將選擇行,因?yàn)檫@是通過sp_estimate_data_compression_savings系統(tǒng)存儲(chǔ)程序使用的選項(xiàng)。點(diǎn)擊計(jì)算按扭來顯示由存儲(chǔ)程序提供的相似信息。
這兩種方法將會(huì)讓你獲得通過壓縮你的表和索引來獲得存儲(chǔ)節(jié)省空間的一個(gè)估計(jì)。
使壓縮在表上可用
為了使壓縮在現(xiàn)有的非分區(qū)表上可用,可以使用有REBUILD選項(xiàng)的ALTER TABLE命令。
- ALTER TABLE Sales.SalesOrderDetail
- REBUILD WITH (DATA_COMPRESSION = ROW);
上面的語句使行壓縮在Sales.SalesOrderDetail表上可用。你也可以繼續(xù)用數(shù)據(jù)壓縮Wizard去使壓縮在表上可用。在點(diǎn)擊選擇壓縮類型頁面上的計(jì)算按扭之后,點(diǎn)擊下一步。在選擇一個(gè)輸出選項(xiàng)的頁面上,你可以選擇要么創(chuàng)建一個(gè)用于評(píng)論的腳本要么保存到一個(gè)文件中,立即運(yùn)行或把它當(dāng)作一個(gè)工作。
作為一個(gè)數(shù)據(jù)庫管理員,你可能會(huì)把這個(gè)當(dāng)作你的數(shù)據(jù)庫日常維護(hù)的一部分,所以你可能也會(huì)為評(píng)論它而創(chuàng)建一個(gè)腳本,然后包括一個(gè)數(shù)據(jù)庫維護(hù)工作。點(diǎn)擊下一步按扭來繼續(xù)。
在點(diǎn)擊完成之前,審查SQL Server 2008數(shù)據(jù)壓縮摘要頁面。
你可能想要?jiǎng)?chuàng)建一個(gè)腳本,這個(gè)腳本通過使用sp_estimate_data_compression_savings系統(tǒng)存儲(chǔ)程序來遍歷所有的表,以此來產(chǎn)生摘要報(bào)告,而系統(tǒng)存儲(chǔ)程序?qū)?huì)幫助你分析你會(huì)壓縮哪些表或者索引。
【編輯推薦】