可更新聚集列存储索引幻想

在今天的文章里,我想专门详细谈下SQL Server 2014引入的可更新聚集列存储索引(Updateable Clustered ColumnStore Index)。在我们进入细节讨论前,我想先给你简单介绍下它在SQL Server 2012里出现时的情况,还有它们的局限性。

SQL Server 2012里的列存储索引

SQL Server 2012里引入的列存储索引是最热的新特性之一(除AlwaysOn外)。如果使用得当的话,对于数据仓库的工作负荷会带来巨大的性能提升。遗憾的是,它们有2个大的局限性:

  • 只对非聚集列存储索引支持
  • 一旦在表上建立了列存储索引,这个表就只读了,对其数据不允许修改

对一些用户来说,这2个局限性是非常糟糕的。假设你有传统行存储数据的300GB表。使用列存储索引是可以将数据压缩到30GB大小。但SQL Server 2012只允许非聚集列存储索引,这样的话你需要2次存储你的数据:一个在传统行存储格式里,另一个在新的列存储格式里。那是存储的巨大浪费,因为你的查询只用到你的非聚集列存储索引。

一旦你创建了你的非聚集列存储索引,你就不允许修改表数据了——你的表就只读了!当然,对这个问题有一些解决方法,例如分区交换,但你还是需要你自己来实现……

SQL Server 2014里的列存储索引

现在SQL Server 2014做出了一些改变,因为微软已经解决了上述问题——用了一些魔法和幻想:SQL Server 2014提供你可更新的聚集列存储索引(Updateable Clustered ColumnStore Index)!我们一起来具体看下在SQL Server里这个魔法和错误内部发生了什么。

第1个最重要的事实是:直接更新列存储索引是不可能的!在你的INSERT,UPDATE和DELETE事务期间进行完全的解压和压缩太费时间了。因此SQL Server 2014从一些魔法里获得帮助:Delta StoresDelete Bitmap。我们详细看下这2个概念。

每次当你只执行INSERT语句,新记录不直接插入列存储索引——记录会插入Delta Store。Delta Store本身就是典型的B树,有B树的所有缺点和优点。接下来当你从列存储索引读取时,SQL Server同时从压缩的列存储索引和Delta Store里返回你数据。

当你执行DELETE语句时,在压缩的列存储索引里还是什么也没发生。唯一发生的是通过Delete Bitmap记录被逻辑删除。在列存储索引里的每条记录在Delte Bitmap里都有对应位。当你再次读取列存储索引时,SQL Server会忽略在Delete Bitmap里标记为删除的记录。

执行UPDATE语句意味着在Delta Store里插入新的记录,在Delete Bitmap里把原版本记录标记为删除。很简单,是不是?下图显示了详细展示这个概念(来源:http://research.microsoft.com/pubs/193599/Apollo3%20-%20Sigmod%202013%20-%20final.pdf):

因为Delta Store和Delete Bitmap让你的列存储索引看起来是可更新的,但事实上是不可变的。还有个叫做Tuple Mover的后台处理,它定期运行最后把你的修改异步到列存储索引。

在SQL Server 2014里,另外你终于可以定义聚集列存储索引。这就是说你可以不需要将你的数据存储在传统行格式里。直接创建你的表,在上面创建聚集列存储索引。用这个方法可以在存储里节约大量空间,因为现在一切都是压缩的。当你进一步和关系数据库概念打交道时,聚集(Clustered)意味着已排序(Sorted)。但是使用聚集列存储索引这句话是不对的:当你创建了聚集列存储索引时,在你数据里是没有排序的!请意识到这个小区别!

小结

可更新的聚集列存储索引是SQL Server 2014一个神奇的幻想。不要理解错了:我是的确很喜欢用这个新特性引入的发展潜能,但你如果想要充分用好它,就要理解这个特性内部是如何实现的。

感谢关注!

时间: 2024-10-10 13:11:24

可更新聚集列存储索引幻想的相关文章

在SQL Server 2014里可更新的列存储索引 (Updateable Column Store Indexes)

传统的关系数据库服务引擎往往并不是对超大量数据进行分析计算的最佳平台,为此,SQL Server中开发了分析服务引擎去对大笔数据进行分析计算.当然,对于数据的存放平台SQL Server数据库引擎而言,也是需要强大的数据处理能力的. 在SQL Server 2012时,SQL Server 引入了列存储索引,用以显著提供高传统数据仓库类型语句的性能,并在SQL Server 2014中做了进一步加强.本文将在对SQL Server 2012列存储索引简单介绍的基础上,进一步解释SQL Serve

SQL Server 2016 —— 聚集列存储索引的功能增强

作者 Jonathan Allen,译者         邵思华         发布于     2015年6月14日 聚集列存储索引(CC Index)是SQL Server 2014中两大最引人瞩目的特性之一,设计为用于超过1千万条记录的数据表.使用者无需明确的指定索引,也能够保证分析式查询的优良性能. 但2014版本中的这一特性存在着一个缺陷,即使用者无法指定索引.虽然CC索引比起传统表的表扫描要快得多,但它还是及不上经手动调整的覆盖索引.因此,为了同时支持这两种模式,开发者不得不创建两张

解读SQL Server 2014可更新列存储索引——存储机制

概述 SQL Server 2014被号称是微软数据库的一个革命性版本,其性能的提升的幅度是有史以来之最. 可更新的列存储索引作为SQL Server 2014的一个关键功能之一,在提升数据库的查询性能方面贡献非常突出.据微软统计,在面向OLAP查询统计类系统中,相比其他SQL传统版本的数据库,报表查询的性能最大可提升上十倍. 下面我们从存储的角度来了解下SQL Server 2014的可更新列存储索引. 什么是列存储 微软为了提升SQL Server的查询性能,更好的支持大数据分析,早在SQL

SQL Server 2014 聚集列存储

SQL Server 自2012以来引入了列存储的概念,至今2016对列存储的支持已经是非常友好了.由于我这边线上环境主要是2014,所以本文是以2014为基础的SQL Server 的列存储的介绍.下面我们主要看一下列存储的发展以及一些原理: 列存储的开发是想要处理超大量数据进行分析计算,于是在SQL Server 2012时,SQL Server 引入了列存储索引,用以显著提供高传统数据仓库类型语句的性能,并在SQL Server 2014中做了进一步加强.列存储会将一个列的数据单独存放在一

SQL Server 2016新特性:列存储索引新特性

行存储表可以有一个可更新的列存储索引,之前非聚集的列存储索引是只读的. 非聚集的列存储索引支持筛选条件. 在内存优化表中可以有一个列存储索引,可以在创建表的时候创建,也可以在之后的alter table语句上创建.之前内存优化表不支持列存储索引. 聚集的列存储索引可以有多个非聚集行存储索引,之前列存储索引不支持非聚集索引. 支持在聚集列存储索引上加入主键和外键约束,约束使用btree索引. 列聚集索引有一个压缩延迟选项,让事务复合收到的影响最小. 兼容级别为120,130的数据库性能: 列存储索

译--列存储索引1:初始列存储索引

2012以后提供了一种不同于传统B树结构的索引类型,就是内存列存储索引.这种索引应用了一种基于列的存储模式,也是一种新的查询执行的批处理模式,并且为特定的负载提供了巨大的性能提升.它是如何构建?如何工作?又是为什么能对性能有如此大的提升,接下来我们用简明的描述和详尽的示例来解释说明. 那么列存储索引究竟是什么?大多数时候,列存储索引被描述作为一种数据仓库和数据报表的功能.事实上,你最有可能就是在这种情况下利用这种索引.然而,即使在OLTP数据库中,你也会遇到一些要从大量数据表中获取数据的报表,它

SQL Server 列存储索引强化

SQL Server 列存储索引强化 SQL Server 列存储索引强化... 1 1. 概述... 1 2.背景... 2 2.1 索引存储... 2 2.2 缓存和I/O.. 2 2.3 Batch处理方式... 2 3 聚集索引... 3 3.1 提高索引创建... 4 3.2 采样的支持... 4 3.3 BookMark的支持... 4 3.4 其他加强... 4 4 更新处理... 4 4.1 随机插入... 6 4.2 批量插入... 6 4.3 删除和更新... 6 4.4 对

SQL Server 2012笔记分享-9:理解列存储索引

优点和使用场景 SQL Server 内存中列存储索引通过使用基于列的数据存储和基于列的查询处理来存储和管理数据. 列存储索引适合于主要执行大容量加载和只读查询的数据仓库工作负荷. 与传统面向行的存储方式相比,使用列存储索引存档可最多提高 10 倍查询性能,与使用非压缩数据大小相比,可提供多达 7 倍数据压缩率. SQL 2012和SQL 2014列存储索引的比较 在SQL server 2012中,一旦启用了列存储索引,将不能够对已启用列存储索引的数据存储执行变更写入操作,也就是说列存储索引适

SQL Server 2016:内存列存储索引

作者 Jonathan Allen,译者 谢丽 SQL Server 2016的一项新特性是可以在"内存优化表(Memory Optimized Table)"上添加"列存储索引(Columnstore Index)".要理解这是什么意思,我们应该首先解释术语列存储索引和内存优化表.列存储索引是一种按照列而不是行组织数据的索引.每个数据块只存储一个列的数据,最多包含100万行.因此,如果数据为5列1000万行,那么就需要存储在50个数据块中.当只查询部分列时,这种数