SQL Server 2008中的数据压缩策略
在Types of data compression in SQL Server 2008这篇博客中, Sunil Agarwal提到了在SQL Server 2008中采用的两种压缩策略:
(1)以变长格式存储所有的定长数据类型。在本系列的上一篇文章中,我提到过在SQL Server 2005 SP2中提供的使用vardecimal类型来存储decimal/numeric数据类型以节省存储空间的问题,有兴趣的朋友可以参考上一篇文章最后列出的相关链接以获取更多信息。在SQL Server 2008中,微软将这一思想扩展到了所有的定长数据类型,例如integer,char,float类型。需要注意的是,虽然SQL Server 2008以变长格式存储所有的定长数据类型,但这只是一种存储的具体实现机制,并不会改变任何语义上的东西,任何客户的程序都不需要修改,因为它根本不关心也不必知道数据库内部具体的数据存储方式。
例子一:假设一个表中有一个32位整数列(integer),但是该列的值均在(0~255或-128~127)的范围内,那么SQL Server 2008就可以只用一个字节来存储该列的值,这与之前版本的SQL Server总是使用4个字节来存储该列相比,就节省了75%的空间。
例子二:假设一个表中有一个定长字符串列CHAR(100),在以前的SQL Server版本中,该列总是使用100个字节来存储(即使实际的字符串没有100个字节,也会在其后填充空格以达到长度正好为100)。但是在SQL Server 2008中,该列将根据实际字符串的长度来进行存储,例如"Hello"将只耗费5个字节存储空间,而"This is a longer string"将只需23个字节存储,分别带来95%和77%的存储空间的节省。
当然,在上述例子一中如果实际的数值变化范围超过了一个字节能够表示的范围,那么相应的压缩比就会降低;对于例子二也类似,如果实际的字符串长度接近100,那么压缩效果也会大大降低。这意味着压缩的效果将依赖于实际的数据值的分布,同时也依赖于表的架构定义,这可能不那么明显,但是想象一下上述的例子二,如果将列的定义改为CHAR(150),显然压缩的效果就更为显著。另外请注意,NULL值是不需要占用任何存储空间的(参见下面的行格式)。
在SQL Server 2008 Data Compression这篇博客中,博客作者Shailan Chudasama用一副图形象的说明了上述例子一描述的场景:
&nb
相关文档:
1. 查看数据库的版本
select @@version
2.查看数据库所在机器操作系统参数
exec master..xp_msver
3. 查看数据库启动的参数
sp_configure
4.查看数据库启动时间
select convert(varchar(30),login_time,120) from master..sysprocesses where spid=1
查看数据库服务器名和实例名
print ''Server Name.... ......
TEMPDB不支持自动压缩,且它的数据库和文件压缩能力是有限制的;
如不得不压缩TEMPDB的大小,建议使用离线功能,如下操作:
1.停止SQL SERVER服务;
2.找到sqlservr.exe在磁盘中的位置;
3.使用sqlservr.exe输入命令sqlservr -c -f,这样启动SQL SERVER时,TEMPDB的大小能够保持最小;
4.使用TSQL命令:ALTER DATA ......
本文演示了 SQL Server 2008 分区表实例;
1. 创建测试数据库 ;
2. 创建分区函数;
3. 创建分区架构;
4. 创建分区表;
5. 创建分区索引 ;
6. 分区切换 ;
7. 查询哪些表使用了分区表;
-- 作成者 leno
-- 日期: 2009-06-06 23:50:01.700
-- ......
今天做SQL 优化,查找执行计划时,执行计划,发现此执行计划与以往的计划有所区别;找录互联网,终于找一篇有关研究比较深入的文章;
原执行计划使用的是索引扫描,突然一下会使用索引覆盖技术,效率大增;
SELECT * 的真相:索引覆盖(index coverage)
SELECT *的效率很糟糕吗?当然,所有人都知道这一点,但是为什么 ......
-- sql 2005
1.rownum用法
select * from(
Select rownum=row_number() over(order by 1),* from table
)a where rownum between  ......