[SQL]斯斯有三種,SQL Server 上資料庫的「壓縮」也有三種喔 !
之所以會想要寫這篇,主要是因為個人的工作主要是做技術服務,有些時候會跟一些客戶的 MIS 解釋和說明一些資料庫的問題,但時常會遇到大家所說的資料庫「壓縮」,都是代表的不同的意思,而造成雞同鴨講的狀況,因此想說用點時間,把 SQL Server 內所謂的「壓縮」給整理一下,避免有朋友因為誤會造成困擾。
基本上 「資料庫壓縮」( Shrink Database )、「備份壓縮」(Backup Compression) 和「資料壓縮」(Data Compression) 只是剛好中文翻譯上都有「壓縮」的字眼,也因此大家都時常都簡稱叫做壓縮,但這三種分別是不同的意思,也不是所有版本都可以支援的喔。
「Shrink Database」是用來釋放沒有儲存資料的資料檔或交易紀錄檔,比方說現在資料庫內有些 TABLE 內的資料我們不再需要使用,當我們使用 DELETE 或者是 TRUNCATE TABLE 將資料刪除之後,如果資料庫選項是採用預設的不自動壓縮的話,則原本資料所占用的空間並不會自動釋放出來,而會留著當後續資料庫內有需要使用這些資料 Page 的時候,就可以直接取用。但有時因為一些原因我們在大量的刪除資料之後,希望資料庫釋放未使用的空間,則可以配合 DBCC SHRINKDATABASE 或是 DBCC SHRINKFILE 來壓縮資料庫或檔案。
如上面的圖所示,您可以使用下指令或者是 GUI 介面上的操作來執行,而這樣的功能所有 SQL Server 的版本都有提供,不限制在哪個 SQL Server 的版本。
「Backup Compression」備份壓縮是用來縮減備份時所占用的空間,其最早是出現在 SQL Server 2008 Enterprise 的版本,但在 SQL Server 2008 Standard Service Pack 1 之後的版本也都開始支援備份壓縮。雖然 SQL Server Express 不支援備份壓縮,但在 Standard 或 Enterprise 版本上建立的備份壓縮,依然可以在 Express 版本上進行還原。由於備份壓縮是在資料庫進行備份的時候才會有影響,因此不論有沒有進行資料庫壓縮,對於一般資料庫上面的所有資料處理,都不會有任何的影響。而在備份的時候由於備份壓縮通常只需要比原本沒有設定壓縮時更少的 I/O 處理,因此可以大幅提升備份速度和減少儲存空間,但相對的是在進行時會大幅增加 CPU 使用量,這點要稍微注意一下。
在 SQL Server 2008/2012 的版本中,我們可以使用 SSMS 下更改「伺服器屬性」→「資料庫設定」→「壓縮備份」的設定值,決定當使用 Backup 指令的時候,預設情況下備份資料庫時是否要採用壓縮的方式來進行。
或者是在備份資料庫的時候才決定是否要採用備份壓縮。
至於要怎麼查看備份檔是否是採用備份壓縮呢 ? 這個部分可以透過 RESTORE HEADERONLY 的指令,就可以透過 Compressed 的欄位知道該備份檔是否有壓縮。
「Data Compression」資料壓縮主要是拿來壓縮資料存放時所占用的空間,是 SQL Server 2008 Enterprise 開始提供的,目前該功能只允許在 Enterprise 以上的版本才可以使用,SQL Server 支援資料表和索引的「資料列壓縮」與「頁面壓縮」兩種壓縮模式。 當我們在資料庫內採用資料壓縮時除了節省空間之外,資料壓縮也有助於改善 I/O 密集型工作負載的效能,因為資料會儲存在更少的頁面中,而且查詢需要從磁碟讀取的頁面也變少了。雖然設定好之後就可以使用,相關使用的 SQL 指令也不需要做任何的變更或調整,但與備份壓縮相同,資料在讀取和寫入的時候會耗用額外的 CPU 資源來進行壓縮和解壓縮資料,因此如果 SQL Server 主機的 CPU 原本就已經是瓶頸的狀況下,可能會對部分作業有所影響。
如果要設定資料壓縮,則可以使用 SSMS 或在資料表或索引上按下滑鼠右鍵,選擇「儲存體」→「管理壓縮」,透過壓縮精靈來選擇要使用 Row(資料列壓縮) 或 Page (頁面壓縮)
但在使用過程中要注意,當有表格或索引設定資料壓縮一次之後,則所有進入該物件內的資料都會自動採用壓縮的方式儲存,因此不需要利用 SQL Agent 定時去針對物件設定壓縮或者是重整;但由於資料壓縮是 Enterprise 以上版本才提供的功能,因此只要該資料庫內有任何一個表格或者是一個索引有設定壓縮,則該資料庫不論使用卸離或者是備份的方式,都不能再拿到其他較低的版本上來使用,除非先解除壓縮設定,這一點要特別注意一下。
以上是個人針對這三種常被混淆的壓縮做一些整理,如果想要對上述這三種壓縮能有更詳細的了解,則可以參考以下相關連結:
壓縮資料庫 http://msdn.microsoft.com/zh-tw/library/ms189035.aspx
備份壓縮 http://technet.microsoft.com/zh-tw/library/bb964719(v=sql.110).aspx
資料壓縮 http://technet.microsoft.com/zh-tw/library/cc280449.aspx