几个月前,我们带您了解了微软下一代数据库平台SQL Server Denali的列存储索引功能。针对数据仓库级别的表,它能够在很大程度上改善查询性能。在最新的社区预览版CTP3中,我们有幸接触到列存储索引的完整功能,那么在本文中,我们就将深入了解一下其中的奥秘。 同我们熟悉的“行存储”格式不一样,新的架构中每一列索引中的数据都是单独分组并存放的,而列数据是可以被压缩的。
此外,当DBA在列存储索引上运行一个查询的时候,SQL Server只读取查询中使用到的列。这样的结果就是:更少的磁盘I/O和更少的内存占用,所以查询的性能将提升数十倍甚至一百倍。 对于列存储索引和行存储索引,我们在本文……
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
几个月前,我们带您了解了微软下一代数据库平台SQL Server Denali的列存储索引功能。针对数据仓库级别的表,它能够在很大程度上改善查询性能。在最新的社区预览版CTP3中,我们有幸接触到列存储索引的完整功能,那么在本文中,我们就将深入了解一下其中的奥秘。
同我们熟悉的“行存储”格式不一样,新的架构中每一列索引中的数据都是单独分组并存放的,而列数据是可以被压缩的。此外,当DBA在列存储索引上运行一个查询的时候,SQL Server只读取查询中使用到的列。这样的结果就是:更少的磁盘I/O和更少的内存占用,所以查询的性能将提升数十倍甚至一百倍。
对于列存储索引和行存储索引,我们在本文中做了一个对比测试,测试表中包含8500万行数据,笔者使用了不同组合,而得出的结论同微软SQL Server在线指南中的结果完全一致:
- 列存储索引往往比行存储索引要快。SQL Server在线指南中提到某些特定的情况下,行存储索引的性能更好,但是大部分情况下毫无疑问是列存储索引;
- 同预期的一样,列存储索引在使用聚合以及过滤的查询中效果更佳;
- 查询优化器会选择列存储索引比行存储索引速度更快;
- 查询执行时间根据不同的应用场景,可能会快上几十倍或者上百倍。列中重复的value越多,那么说明它的压缩率就越高,因此得到的性能提升也更高。同样地,对于数据类型来说也是如此;
- 构建一个列存储索引同行存储索引所需要的时间几乎相同。在CTP2版本中,所有的微软MVP试用者都反映列存储索引的构建时间要长一些。但是在CTP3中,微软已经对这一功能进行了改进。
考虑一个特殊的场景:一个查询返回结果中有两列,其中value的区别不大;结果集包含850行。使用传统的行存储索引,查询大约花掉了4分钟时间,而使用列存储索引,执行时间降到了1.2秒,速度提升了200倍。此外,测试的Denali Server是一个虚拟机,没有对磁盘I/O进行过优化。
妥善使用列存储索引
列存储索引并不是完美无暇,它也有自身的限制。每一个表当中只能由一个列存储索引,如果使用表分区,那么你必须在索引中包含分区列。不能包含以下的数据类型:二进制、可变二进制、文本、备注、图像、varchar(max)、nvarchar(max)、唯一标识符、时间戳、精度大于18位的小数和数字、CLR以及XML。
除了数据类型限制之外,SQL Server Denali列存储索引中最大的限制是:一旦你创建了一个列存储索引,表就变成只读了,因此任何不能再做任何的数据修改。这对于任何一个更新频繁的表来说都是不太好的消息。
微软对此还要做出相应的调整,目前最直接的方法就是只能在预先设置的时间内更新表。删除或者废除索引,然后在更新之后进行重建。
或者可以使用分区。使用insert添加一个新的分区,想要更新现有行的时候,再断开,drop列存储索引,更新数据,重现创建索引然后再添加到表中。
最后的方法,就是将数据分片成静态数据然后进行更新。保持列存储索引表中的静态数据,然后将需要更新的数据存储在不同的索引表当中。使用UNION ALL语句来从这两种表中进行select。使用这种方法,也能获得部分效果:静态数据表中的列存储索引可以加快查询速度,而另外的传统表格则速度不会提升。
当然,这样的情况并不是十分常用,主要适用于数据仓库表或者不经常使用的在线交易处理表等。在SQL Server在线指南中提醒我们慎重使用列存储索引,而这部分功能在未来的正式版中可能会有所改动。所以我们可以推测,在正式版本的SQL Server Denali中,我们将不会受到这样的限制。
SQL Server Denali的列存储索引功能在特定环境中的效果十分明显,特别是数据仓库。查询性能上的改进意味着在实际运行中的查询时间将大幅缩短,而我们不需再使用静态数据的聚合表,然后定期刷新了。在使用之前充分考虑公司的具体业务需求,将能达到事半功倍的效果。
作者
翻译
相关推荐
-
表征数据库性能问题的三个指标
即使数据库结构定义和SQL代码编写非常完美,应用程序性能都可能下降。如果性能问题不能得到及时纠正,那么就可能为公司带来很大的损失。
-
SAP HANA数据存储:传统硬盘的瓶颈问题
本文选自《Implementing SAP HANA》,主要探讨了基于传统磁盘的数据库性能问题,以及我们如何解决这一问题。
-
大数据查询怎样才能避免越来越慢?
随着积累的数据越来越多,内部用户和分析师会执行更多的报表和预报。这些都会导致额外的查询、分析及报表。
-
大数据时代我们是否还需要数据库设计?
良好的数据库设计是系统和应用程序设计的一部分。很多的业务需求,如数据可用性,清理处理,还有应用性能都可以利用特定的数据库设计加以解决。