數(shù)據(jù)庫(kù)在使用一段時(shí)間后,時(shí)常會(huì)出現(xiàn)因數(shù)據(jù)刪除而造成數(shù)據(jù)庫(kù)中空閑空間太多的情況,這時(shí)就需要減少分配給數(shù)據(jù)庫(kù)文件和事務(wù)日志文件的磁盤(pán)空間,以免浪費(fèi)磁盤(pán)空間。當(dāng)數(shù)據(jù)庫(kù)中沒(méi)有數(shù)據(jù)時(shí),可以修改數(shù)據(jù)庫(kù)文件屬性直接改變其占用空間,但當(dāng)數(shù)據(jù)庫(kù)中有數(shù)據(jù)時(shí),這樣做會(huì)破壞數(shù)據(jù)庫(kù)中的數(shù)據(jù),因此需要使用壓縮的方式來(lái)縮減數(shù)據(jù)庫(kù)空間。可以在數(shù)據(jù)庫(kù)屬性選項(xiàng)中選擇“Auto shrink”選項(xiàng),讓系統(tǒng)自動(dòng)壓縮數(shù)據(jù)庫(kù),也可以用人工的方法來(lái)壓縮。人工壓縮數(shù)據(jù)庫(kù)有以下兩種方式:
1、用Enterprise Manager 壓縮數(shù)據(jù)庫(kù) 在Enterprise Manager 中在所要壓縮的數(shù)據(jù)庫(kù)上單擊右鍵,從快捷菜單中的“所有任務(wù)(All Tasks)”中選擇“Shrink Database(壓縮數(shù)據(jù)庫(kù))”選項(xiàng),就會(huì)出現(xiàn)如圖6-10 所示的對(duì)話框。可以在圖6-10 所示的對(duì)話框中選擇數(shù)據(jù)庫(kù)的壓縮方式,也可以選擇使用壓縮計(jì)劃或壓縮單個(gè)文件。
 單擊圖6-10 中的“Files”按鈕,會(huì)出現(xiàn)如圖6-11 所示的壓縮數(shù)據(jù)庫(kù)文件對(duì)話框,可以針對(duì)每個(gè)數(shù)據(jù)庫(kù)文件進(jìn)行不同的壓縮設(shè)置。

單擊圖6-10 中的“Change” 按鈕,會(huì)出現(xiàn)如圖6-12 所示的壓縮計(jì)劃編輯對(duì)話框,可以指定壓縮計(jì)劃的執(zhí)行方式。單擊圖6-12 中的“Change” 按鈕,會(huì)出現(xiàn)如圖6-13 所示的循環(huán)工作計(jì)劃編輯對(duì)話框,可以編輯計(jì)劃執(zhí)行的周期或時(shí)間點(diǎn)。設(shè)置完成后單擊“OK” 按鈕就開(kāi)始?jí)嚎s數(shù)據(jù)庫(kù),在壓縮結(jié)束后會(huì)顯示一個(gè)壓縮情況信息框。


2、用Transact-SQL 命令壓縮數(shù)據(jù)庫(kù) 可以使用DBCC SHRINKDATABASE 和DBCC SHRINKFILE 命令來(lái)壓縮數(shù)據(jù)庫(kù)。其中DBCC SHRINKDATABASE 命令對(duì)數(shù)據(jù)庫(kù)進(jìn)行壓縮,DBCC SHRINKFILE 命令對(duì)數(shù)據(jù)庫(kù)中指定的文件進(jìn)行壓縮。
(1) DBCC SHRINKDATABASE DBCC SHRINKDATABASE 命令語(yǔ)法如下: DBCC SHRINKDATABASE (database_name [, target_percent] [, {NOTRUNCATE | TRUNCATEONLY}] ) 各參數(shù)說(shuō)明如下:
- target_percent 指定將數(shù)據(jù)庫(kù)壓縮后,未使用的空間占數(shù)據(jù)庫(kù)大小的百分之幾。如果指定的百分比過(guò)大,超過(guò)了壓縮前未使用空間所占的比例,則數(shù)據(jù)庫(kù)不會(huì)被壓縮。并且壓縮后的數(shù)據(jù)庫(kù)不能比數(shù)據(jù)庫(kù)初始設(shè)定的容量小。
- NOTRUECATE
將數(shù)據(jù)庫(kù)縮減后剩余的空間保留在數(shù)據(jù)庫(kù),中不返還給操作系統(tǒng)。如果不選擇此選項(xiàng),則剩余的空間返還給操作系統(tǒng)。
- TRUNCATEONLY
將數(shù)據(jù)庫(kù)縮減后剩余的空間返還給操作系統(tǒng)。使用此命令時(shí)SQL Server 將文件縮減到最后一個(gè)文件分配,區(qū)域但不移動(dòng)任何數(shù)據(jù)文件。選擇此項(xiàng)后,target_percent 選項(xiàng)就無(wú)效了。 例6-14: 壓縮數(shù)據(jù)庫(kù)mytest 的未使用空間為數(shù)據(jù)庫(kù)大小的20%。 dbcc shrinkdatabase (mytest, 20) 運(yùn)行結(jié)果如下: DBCC execution completed. If DBCC printed error messages, contact your system administrator.
(2) DBCC SHRINKFILE DBCC SHRINKFILE 命令壓縮當(dāng)前數(shù)據(jù)庫(kù)中的文件。其語(yǔ)法如下: DBCC SHRINKFILE ( {file_name | file_id } { [, target_size] | [, {EMPTYFILE | NOTRUNCATE | TRUNCATEONLY}] } ) 各參數(shù)說(shuō)明如下:
- file_id
指定要壓縮的文件的鑒別號(hào)(Identification number, 即ID)。文件的ID 號(hào)可以通過(guò) FILE_ID()函數(shù)或如本章前面所講述的Sp_helpdb 系統(tǒng)存儲(chǔ)過(guò)程來(lái)得到。
- target_size
指定文件壓縮后的大小。以MB 為單位。如果不指定此選項(xiàng),SQL Server 就會(huì)盡最大可能地縮減文件。
- EMPTYFILE
指明此文件不再使用,將移動(dòng)所有在此文件中的數(shù)據(jù)到同一文件組中的其它文件中去。執(zhí)行帶此參數(shù)的命令后,此文件就可以用ALTER DATABASE 命令來(lái)刪除了。 其余參數(shù)NOTRUNCATE 和TRUNCATEONLY 與DBCC SHRINKDATABASE 命令中的含義相同。 例6-15: 壓縮數(shù)據(jù)庫(kù)mydb 中的數(shù)據(jù)庫(kù)文件mydb_data2 的大小到1MB。 use mydb dbcc shrinkfile (mydb_data2, 1)
|