SQL Server数据库的压缩处理
前两天,所在的项目要发一个试用版给用户,需要包含一些给客户的演示数据。但由于产品是基于数据分析的,数据量很大,所以在空库上重新建立数据的任务量很大,加上团队的人手一直较为紧缺,故决定在之前用来测试的数据库上做修改,删除多余的数据,并加上了一些展示数据。然而数据处理完成后,发现数据库依然有400多MB,想将数据做一些压缩处理,减少数据库的大小。在此,将过程中用到的一些方法罗列出来。
- 查看数据库的空间使用情况 EXEC sp_spaceused,结果集中包含database_size(当前数据库的大小,包括数据和日志文件)、 unallocated space(未保留供数据库对象使用的数据库空间)、 reserved(由数据库中对象分配的空间总量)、index_size(索引使用的空间总量)和unused(为数据库中的对象保留但尚未使用的空间总量)
- 收缩数据库,DBCC SHRINKDATABASE和DBCC SHRINKFILE。此外,SQL Server 2008在表级别和索引级别上支持行和页的压缩,行压缩主要是对使用可变长度存储格式的数据类型和通过使用不存储空字符的可变长度格式来存储定长字符串,对于数据为NULL和0的进行优化,使其不占用存储空间。页压缩按行压缩、前缀压缩、字典压缩的顺序进行,页压缩比行压缩更好一些,不过代价是较高的CPU占用率。
- SSMS自带的数据导入、数据导出和生成脚本的功能,不过数据导出到一个新建的空的数据库的的话不会将外键、索引的导入,而是仅仅是数据的导入
- 利用SSMS Tools(第三方的一个插件),提供了一些常用的功能,将数据库或表中的所有数据生成插入的脚本(Generate Insert Scripts)、在所有表中查找某一数据等
- 取消所有表的约束,全选复制,然后F5执行
select 'alter table '+quotename(object_Name(parent_obj))+' nocheck CONSTRAINT all ' from sysobjects where Xtype='F';