揭秘SQL Server 2014有哪些新特性(3)-可更新列存储聚集索引

简介

列存储索引其实在在SQL Server 2012中就已经存在,但SQL Server 2012中只允许建立非聚集列索引,这意味着列索引是在原有的行存储索引之上的引用了底层的数据,因此会消耗更多的存储空间,但2012中的限制最大的还是一旦将非聚集列存储索引建立在某个表上时,该表将变为只读,这使得即使在数据仓库中使用列索引,每次更新数据都变成非常痛苦的事。SQL Server 2014中的可更新聚集列索引则解决了该问题。

可更新聚集列存储索引?

聚集列存储索引的概念可以类比于传统的行存储,聚集索引既是数据本身,列存储的概念也是同样。将数据按照列存储而不是行存储则提供了诸多好处,

首先对于大量聚合、扫描、分组等数据仓库类查询仅仅需要读取选择的列,对于需要Join多个表的星型结构等场景性能提升尤其明显 其次是列索引可以更新,并且每个表中只需要一个(这是优点也是缺点,因为无法再建非聚集索引)聚集列索引即可,大大节省了空间 列索引由于是按列存储,同一列中数据类型是一样的,因此可以更加容易的实现更高的压缩比率 列存储的表会占用更少的存储空间,因此存在更少的IO

那么列存储索引有什么弊端呢?

行存储对于OLTP操作十分适合,因为每个聚集索引键可以标识某一行,该行存储在物理磁盘上也连续,因此可以利用Seek操作完成大量选择性非常高的查询,而列存储索引同一行的每一列并不在物理上联系,并且列存储聚集索引中并没有“主键”的概念,因此并不存在SEEK操作,如果大量OLTP类的查询,性能将会出现问题。

列存储索引只支持Scan操作,如图1所示。

图1.列存储索引只支持Scan操作

那么列索引是如何存储呢?

列索引存储可以望文生义,就是按列存储。这个过程可以分为3个阶段,首先将一堆行分组,这就是所谓的“行组”,分组完成后,再按列切分,最后将列压缩,如图2所示。

图2.列存储的过程

我们注意到其中有一部分不够分组的,那么就直接让这部分数据以传统行存储的形式老实呆着吧,这就是所谓的Deltastore,等数据增长到可以分组时再进行分组,目前SQL Server 2014认为10W以下的数据都不够分组。

上述列存储的两部分我们可以通过2014新引入的DMV进行观测,如图3所示。在图3中,我们队目前已经存在31465行的聚集列索引插入了1000行新的数据,则SQL Server认为这部分数据不满10W行,因此以Deltastore的方式存在。

图3.压缩后的列和Deltastore

当我们再插入1000数据时,可以观察到DeltaStore中的数据又增加了1000,达到2000,但依然存在DeltaStore中。如图4所示。

图4.再次插入的数据依然在DeltaStore中

那么我插入大量的行进行观测,会发现,大批量的数据依然以DeltaStore的方式存储,如图5。

图5.插入大量数据后也无法将数据压缩

那么究竟何时会压缩这些数据呢,根据BOL的说法:http://msdn.microsoft.com/en-us/library/dn223749(v=sql.120).aspx,会有一个后台的线程定期检测,此外当重建或整理索引时也可以自动归档,如图6所示。

图6.重建索引后归档列存储索引

空间占用比较

可更新列存储聚集索引的压缩比率是最高的,因为同一列往往是同一类数据,因此这类数据有更好的压缩比。现在我纯粹的从传统聚集索引、页压缩、行压缩、列存储索引所占用的空间进行比较,当然,如果我们把传统表的非聚集索引算上,那么行存储表将会需要更多的空间。我们用3W多条数据进行简单比对,如图7所示。

图7.不同存储占用空间

图7的示例数据很少,但依然可以看到,列存储比即使没有非聚集索引的行存储,占用空间也几乎少了2/3,提升不可谓不巨大。

性能简单比较

首先,先按照列存储,我们选择所有的列,对于行存储来说需要选择整个表才能把一列数据全部读取出来,但列存储则只需要读取被选择的列,因此如果只选择特定的列的话,列存储性能提升巨大,如图8所示。

图8.可更新列存储聚集索引性能提升巨大

但反之,我们尝试一个典型的OLTP操作,只选择一行的所有列,则会和图8的结果大相庭径了。如图9所示。

图9.对于OLTP操作来说,列存储索引非常乏力

小结

本文阐述了SQL Server 2014中可更新列存储索引的原理,概念,适用场景、空间使用情况,并举出两个OLAP和OLTP极端的例子进行性能比对。列存储索引对于数据仓库和类OLAP查询来说是一个巨大的飞跃。

(0)

相关推荐

  • 如何获取SqlServer2005表结构(字段,主键,外键,递增,描述)

    1.获取表的基本字段属性 复制代码 代码如下: --获取SqlServer中表结构 SELECT syscolumns.name,systypes.name,syscolumns.isnullable,syscolumns.length FROM syscolumns, systypes WHERE syscolumns.xusertype = systypes.xusertype AND syscolumns.id = object_id('你的表名') 运行效果 2.如果还想要获取字段的描述

  • SQL Server表中添加新列并添加描述

    注: sql server 2005 及以上支持. 版本估计是不支持(工作环境2005,2008). 工作需要, 需要向SQL Server 现有表中添加新列并添加描述. 从而有个如下存储过程. (先附上存储过程然后解释) /********调用方法********** 作用: 添加列并添加列描述信息 调用: exec [SetColumnInfo] '表名', '列名', N'列说明,描述','列类型{默认:NVARCHAR(50)}','列默认值{默认:NULL}' ************

  • 揭秘SQL Server 2014有哪些新特性(3)-可更新列存储聚集索引

    简介 列存储索引其实在在SQL Server 2012中就已经存在,但SQL Server 2012中只允许建立非聚集列索引,这意味着列索引是在原有的行存储索引之上的引用了底层的数据,因此会消耗更多的存储空间,但2012中的限制最大的还是一旦将非聚集列存储索引建立在某个表上时,该表将变为只读,这使得即使在数据仓库中使用列索引,每次更新数据都变成非常痛苦的事.SQL Server 2014中的可更新聚集列索引则解决了该问题. 可更新聚集列存储索引? 聚集列存储索引的概念可以类比于传统的行存储,聚集

  • 揭秘SQL Server 2014有哪些新特性(1)-内存数据库

    简介 SQL Server 2014提供了众多激动人心的新功能,但其中我想最让人期待的特性之一就要算内存数据库了.去年我再西雅图参加SQL PASS Summit 2012的开幕式时,微软就宣布了将在下一个SQL Server版本中附带代号为Hekaton的内存数据库引擎.现在随着2014CTP1的到来,我们终于可以一窥其面貌. 内存数据库 在传统的数据库表中,由于磁盘的物理结构限制,表和索引的结构为B-Tree,这就使得该类索引在大并发的OLTP环境中显得非常乏力,虽然有很多办法来解决这类问题

  • 揭秘SQL Server 2014有哪些新特性(2)-固态硬盘 Buffer Pool(缓冲池) 扩展

    简介 SQL Server 2014中另一个非常好的功能是,可以将SSD虚拟成内存的一部分,来供SQL Server数据页缓冲区使用.通过使用SSD来扩展Buffer-Pool,可以使得大量随机的IOPS由SSD来承载,从而大量减少对于数据页的随机IOPS和PAGE-OUT. SSD AS Buffer Pool SSD是固态硬盘,不像传统的磁盘有磁头移动的部分,因此随机读写的IOPS远远大于传统的磁盘.将SSD作为Buffer Pool的延伸,就可以以非常低的成本巨量的扩充内存.而传统的模式是

  • 揭秘SQL Server 2014有哪些新特性(4)-原生备份加密

    SQL Server 2014 CTP2之后公布了一项针对备份的特性,那就是原生备份加密.考虑到之前网络上影响很坏的数据库泄漏事件,本质上都是数据库备份泄漏给第三方导致,SQL Server的原声数据备份可以使得即使备份本身被盗,在没有加密证书的情况下也无法使用,这有效的解决了上述数据泄漏问题.原先的解决方案 在SQL Server 2014之前,如果希望实现对备份实现加密,会通过如下两种方式之一实现: 使用透明数据加密(TDE)加密整个数据库,从而使得备份和事务日志也会被加密 使用第三方备份加

  • 升级SQL Server 2014的四个要点要注意

    升级并不容易,但是有一些特性值得花时间了解.下面本文将介绍一些避免升级问题的技巧. 升级一个关键业务SQL Server实例并不容易;它要求有周全的计划.计划不全会增加遇到升级问题的可能性,从而影响或延迟SQL Server 2014的升级.在规划SQLServer 2014升级时,有一些注意事项有助于避免遇到升级问题. 注意:升级SQL Server 2014的四个要点! 选择升级策略 在SQL Server升级中考虑采用内部或是并行迁移策略.我首选并行迁移策略,因为它风险较低,即便难度更大一

  • SQL Server 2014 数据库中文版安装图文教程

    SQL Server 2014三大新特性:集成内存OLTP.BI和混合云搭建,那么记录一下我们的安装过程及配置. 软件环境准备 SQL Server 2014版支持的操作系统有:Windows Server 2008.Windows Server 2008 R2.Windows Server 2012.Windows Server 2012 R2.标准版还支持 Windows 7.Windows 8.Windows 8.1 操作系统. 安装 .Net Framework 3.5 sp1 如果本机

  • 如何在SQL Server 2014中用资源调控器压制你的存储?

    在今天的文章里,我想谈下SQL Server 2014里非常酷的提升:现在你终于可以根据需要的IOPS来压制查询!资源调控器(Resource Governor)自SQL Server 2008起引入,但提供的功能还是有所限制:你只能限制CPU时间(这个已经很棒了),还有你能限制查询(从每个独立的查询)内存量. 但作为DBA的你,你经常会进行一些数据库维护操作,例如索引重建,DBCC CHECKDB操作等.我们都知道,这些操作会在你的存储里带来大量的IOPS直至峰值.如果在7 * 24在线的数据

  • SQL SERVER 2014 安装图解教程(含SQL SERVER 2014下载)

    2015年1月1日,新的一年开始之际,本来应该好好做点有意义的事情来跨个年的.结果,老习惯 - 睡觉之前一定要折腾一下电脑,说干就干,给新到的 DELL 电脑装虚机,下载 SQL SERVER 2014,安装 SQL SERVER 2014. SQL SERVER 2014 安装完成以后,不像 SQL SERVER 2008 R2 会提供一个 BIDS 开发工具,也不像 SQL SERVER 2012 会提供一个 SSDT 开发工具,也就是说 BI 的开发工具(SSIS, SSRS, SSAS)

  • 远程登陆SQL Server 2014数据库的方法

    远程登陆SQLServer (2014)数据库,供大家参考,具体内容如下 两台电脑,同一个局域网内,IP同一网段 配置: Computer1: Windows10,安装SQL Server 2014 enterprise版(作为服务器) Computer2: Windows 10,VS2015 Computer1:(1)设置Windows用户和SQL Server身份验证两种登陆方法 (2)配置SQL Server 配置管理器 网络配置将Named Pipes和TCP/IP协议均打开,TCP/I

  • JavaScript基于activexobject连接远程数据库SQL Server 2014的方法

    本文实例讲述了JavaScript基于activexobject连接远程数据库SQL Server 2014的方法.分享给大家供大家参考,具体如下: 最近翻开一本10年前买的JavaScript的书,这本书买回来只看了前半部分,后面的一直没看,也一直没有从事这方的工作. 看到有一节写着js连access接数据库,于是照着书上的代码,写了一段在chrome浏览器中运行,发现完全没反应. 查了一下才发现,这个activexobject只有微软的IE支持,其他的浏览器都不支持,我想可能是由于连接数据库

随机推荐