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