數(shù)據(jù)壓縮是對(duì)存儲(chǔ)和性能優(yōu)勢(shì)的加強(qiáng)。減少數(shù)據(jù)庫(kù)占用的磁盤空間量將減少整體數(shù)據(jù)文件存儲(chǔ)空間,在一下幾個(gè)方面增加吞吐量:
1.更好的I/O利用率,每個(gè)頁(yè)面可以讀寫更多的數(shù)據(jù)。
2.更好的內(nèi)存利用率,緩沖區(qū)可以緩存更多的數(shù)據(jù)。
3.減少頁(yè)面的閉鎖,每個(gè)頁(yè)面可以包含更多數(shù)據(jù)。
由于數(shù)據(jù)壓縮必須考慮I/O 和CPU之間的平衡,壓縮和解壓縮都需要CPU處理。因此數(shù)據(jù)壓縮對(duì)于舊數(shù)據(jù)和不經(jīng)常查詢的數(shù)據(jù)更有意義。
這里我們主討論兩種壓縮:一是行壓縮;二是頁(yè)面壓縮。
行壓縮:壓縮可以改變格式的存儲(chǔ)固定值數(shù)據(jù)類型--也就說(shuō)包含一個(gè)字節(jié)的值的4字節(jié)列可以壓縮為1字節(jié),1字節(jié)的列不能再壓縮,但是null和0值不占字節(jié)。
語(yǔ)法: 創(chuàng)建 create table 表名()with (DATA_COMPErssION=ROW)
添加 ALTER TABLE 表名 REBUILD with (DATA_COMPERSSION=ROW)
頁(yè)面壓縮:頁(yè)面壓縮在實(shí)現(xiàn)行壓縮的前提下,還實(shí)現(xiàn)了兩種壓縮,一是前綴壓縮(對(duì)于每個(gè)頁(yè)面和列來(lái)說(shuō)前綴值都是相同的,可用來(lái)減少存儲(chǔ)的需求,通過(guò)引用來(lái)取代重復(fù)的前綴);二是字典壓縮(搜索頁(yè)面中的重復(fù)值,這被對(duì)CI的引用取代)。
語(yǔ)法: 創(chuàng)建 create table 表名()with (DATA_COMPERSSION=PAGE)
添加 ALTER TABLE 表名 REBUILD with (DATA_COMPERSSION=PAGE)
估計(jì)節(jié)省空間:語(yǔ)法 sp_estimate_data_comPRession_savings
[@schema_name=]--架構(gòu)名稱
, [@object_name=]--有索引的表或者索引視圖的名稱。
, [@index_name=]--索引ID號(hào)
, [@partition_number=]--對(duì)象分區(qū)號(hào),null表示非分區(qū)
, [@data_compression=] --壓縮類型(none/row/page)
[;]
監(jiān)控?cái)?shù)據(jù)壓縮:windows性能監(jiān)視的sqlserver:access method 對(duì)象中有兩個(gè)計(jì)數(shù)器:
Page compression attempts/sec:計(jì)算每秒進(jìn)行頁(yè)面壓縮嘗試的次數(shù);
Pages compressed/sec:計(jì)算每秒壓縮的頁(yè)面數(shù)。
最后還要注意數(shù)據(jù)壓縮的注意事項(xiàng):
1.啟用和禁用表或群集索引壓縮會(huì)重構(gòu)所有費(fèi)群集索引。
2.不能在稀疏列中使用壓縮。
3.超出行的LOB 不能壓縮。
4.索引中的非葉子也只能使用行壓縮進(jìn)行壓縮。
5.非群集索引不繼承標(biāo)的壓縮設(shè)置。
6.再刪除群集索引時(shí),表將保持這些壓縮設(shè)置。
7.除非特別指定,創(chuàng)建群集索引將繼承表的壓縮設(shè)置。
總結(jié): 我們已經(jīng)了解了基本的使用方式和一些注意事項(xiàng),通過(guò)壓縮實(shí)現(xiàn)高性能的數(shù)據(jù)庫(kù)系統(tǒng)。同時(shí)我們還要兼顧一些硬件成本,最后我們還要注意的是對(duì)于高可用性系統(tǒng),改變壓縮設(shè)置可能會(huì)產(chǎn)生額外的事務(wù)日志操作。
新聞熱點(diǎn)
疑難解答
圖片精選