分析下一代SQL Server Denali列存储索引

日期: 2011-03-06 作者:Roman Rehak翻译:冯昀晖 来源:TechTarget中国 英文

去年,微软推出了PowerPivot,它是为Excel设计的一款新插件,支持不掌握专业技术的用户创建商业智能(BI)应用。在PASS 2009和TechEd 2010大会上,PowerPivot选择了一个数据源,然后把所有数据导入到Excel文件中,一个2000万行的表在Excel文件中只占据50MB空间。更加令人惊奇的是,在该表数据加载到Excel中时,PowerPivot在大约一秒钟内就对这2000万行执行了几次数据扫描。   SQL Server专业人士感到非常兴奋,许多人预测最终该产品将集成到SQL Server中去。

果然,在去年十一月份的Pass大会上,微软宣布了阿波罗计划(即SQL……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

去年,微软推出了PowerPivot,它是为Excel设计的一款新插件,支持不掌握专业技术的用户创建商业智能(BI)应用。在PASS 2009和TechEd 2010大会上,PowerPivot选择了一个数据源,然后把所有数据导入到Excel文件中,一个2000万行的表在Excel文件中只占据50MB空间。更加令人惊奇的是,在该表数据加载到Excel中时,PowerPivot在大约一秒钟内就对这2000万行执行了几次数据扫描。

  SQL Server专业人士感到非常兴奋,许多人预测最终该产品将集成到SQL Server中去。果然,在去年十一月份的Pass大会上,微软宣布了阿波罗计划(即SQL Server Denali)给数据库引擎带来了列存储索引,它可以比利用常规索引查询快几百倍。在demo中,两种方式的查询都运行了,利用传统索引的查询花费了一分钟多,而运行列存储索引的类似查询对数十亿行数据的表都可以立即返回结果。

  那么,为什么列存储索引会这么高效呢?在这闪电般快速的搜索能力背后,有一项微软称为VertiPaq的新技术,它与传统索引采用不同的存储列方式,它有效地压缩了索引中的数据。在常规索引中,所有每行的索引数据都被一起保持在一页中,每列数据在一个索引中是跨所有页保留的。而在列存储索引中,每列数据被保存在一起,这样每个数据也都只包含来自单个列的数据,如图1所示:

图1

  此外,每列的索引数据都进行了压缩,因为许多列都可能包含非常重复的数据值,所以压缩率非常高。这种架构降低了索引中的页数量,如果你只选择几列,它还能降低需要扫描的页数量。因为数据变化的特性,很难预测在你的环境中数据提取会有多快,但是基于微软的一些评论,它比原来要快几倍到几百倍。

  创建列存储索引非常容易。与创建普通索引语法类似,只是关键字变成了“COLUMNSTORE”:

  CREATE COLUMNSTORE INDEX MyIndex

  ON MyTable(colum1, column2, …)

  利用相同的规则,你可以创建常规索引,其中包含你需要的列。这里有几点要注意。在CTP1中,创建列存储索引比创建常规索引需要的时间要长很多,尽管这一点在将来的CTP和发布给厂商的版本(RTM版)中有可能得到改进。另外,一旦你在表中增加了一个列,该表就变成只读了,不能插入,更新或者删除。如果你需要插入新行或者修改现有行,你可以禁用该索引,然后做数据修改,然后再重建列存储索引。由于存在这一限制,这一功能到目前为止更适用于数据仓库这类包含静态数据的表,这种表中只是定期刷新数据,这是可以接受的。然而,你可以利用分区来避免重建索引。例如,你可以创建按日,按周或者按月分区,把数据加载到新表,重建所有索引,然后把表切换到分区表。

  为什么列存储索引提供了更快的查询呢?有三个原因。第一个原因:因为索引中的列数据被压缩了,它占用的空间更小,因此SQL Server只需扫描更少的页。

  第二个原因,因为只需要扫描更少的页,SQL Server就可以把它们保留在内存中,大大地提高了数据停留在内存缓冲区的可能性。因此,在那些内存大的系统中,你会看到更大的性能差异,尤其是当索引被扫描多次并且相应的行存储索引不能装入内存时更明显。

  第三,SQL Server只需要提取查询中用到的列的索引页,而常规索引需要提取全部索引页,包括查询中用不到的那部分。因此,你又一次得到了益处,更少的页需要处理,就会更快得到结果,同样SQL Server也更可能把列缓存保持在内存缓存区中。

  列存储技术可以提供明显的益处,提升用户体验,降低从数据仓库表提取数据返回结果的等待时间。虽然在这一版本中有限制,使得该技术不适用于联机事物处理(OLTP)系统和环境,那你也能在数据仓库的实施中获得巨大的提升。但是,谁知道呢?将来的SQL Server版本,微软可能会突破这些限制,列存储索引将能像现在使用传统索引一样方便。

相关推荐