可更新聚集列存储索引幻想
在今天的文章里,我想专门详细谈下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 Stores和Delete 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一个神奇的幻想。不要理解错了:我是的确很喜欢用这个新特性引入的发展潜能,但你如果想要充分用好它,就要理解这个特性内部是如何实现的。
感谢关注!
参考文章:
https://www.sqlpassion.at/archive/2014/03/25/the-illusion-of-updateable-clustered-columnstore-indexes/
可更新聚集列存储索引幻想相关推荐
- SQL Server 2014聚集列存储索引
转发请注明引用和原文博客(http://www.cnblogs.com/wenBlog) 简介 之前已经写过两篇介绍列存储索引的文章,但是只有非聚集列存储索引,今天再来简单介绍一下聚集的列存储索引,也 ...
- Azure Synapse Analytics (Azure SQL DW)性能优化指南(1)——使用有序聚集列存储索引优化性能
目录 (一)前言 (二)有序与无序聚集列存储索引 (三)查询性能 (四)数据加载性能 (五)减少段重叠 (六)在大型表中创建有序 CCI (六)实战案例 A. 检查有序列和序号: B. 若要更改列序号 ...
- 数据库索引统计信息不一致_列存储索引增强功能–克隆数据库中的索引统计信息更新
数据库索引统计信息不一致 SQL Server was launched in 1993 on WinNT and it completed its 25-year anniversary recen ...
- SQL Server 2016新特性:列存储索引新特性
SQL Server 2016新特性:列存储索引新特性 行存储表可以有一个可更新的列存储索引,之前非聚集的列存储索引是只读的. 非聚集的列存储索引支持筛选条件. 在内存优化表中可以有一个列存储索引,可 ...
- 消息 35371-聚集列存储索引
sqlserver版本:2014 操作,对线上库库存表加CCI. 表:dbo.product 然后就收到开发的消息,被告知查询报错. 消息 35371,级别 16,状态 1,第 1 行 具有聚集 ...
- SQL Server中的列存储索引
先决条件 (Prerequisite ) 通过理论和实践措施可以更好地解释与SQL Server 2012列存储索引有关的讨论. 因此,对于实际测量部分–我将使用AdventureWorksDW201 ...
- 行存储索引改换成列存储索引_列存储索引增强功能–数据压缩,估计和节省
行存储索引改换成列存储索引 Data compression is required to reduce database storage size as well as improving perf ...
- SQL Server 2016 列存储索引功能增强
列存储索引(columnstore index)在SQL Server 2012中已经引入,其带来性能提升的同时也有很多限制,比如对带有列存储索引的表进行INSERT, UPDATE和DELET ...
- 行存储索引改换成列存储索引_如何使用列存储索引来改善数据仓库登台环境
行存储索引改换成列存储索引 My team and I were recently tasked with refactoring older data marts, particularly tho ...
- mysql按照列构建索引_列存储索引增强功能–在线和离线(重新)构建
mysql按照列构建索引 In this article, we will explore ' Clustered columnstore online index build and rebuild ...
最新文章
- Android零碎知识点-更新中
- 如何为JBoss Developer Studio 8设置集成和SOA工具
- AMD Mantle再添新作,引发下代GPU架构猜想
- redis的多路复用是什么鬼
- 江陵中学2021高考成绩查询,2021高考序幕拉开 荆州38080名考生赴考
- 湖北大学计算机科学与技术怎么样,湖北大学(专业学位)计算机技术考研难吗
- 40行代码教你利用Python网络爬虫批量抓取小视频
- nand linux bbt存储,Linux NAND BBT管理
- MTK 驱动(38)---MTK 待机问题分析
- 重读模式与架构(2)——层次划分的依据和角色职责
- 十二、实战底部(二)
- Oprofile工具的使用
- 微信小程序开发调用接口
- 工业物联网与人工智能合体之后 竟把魔爪第一个伸向了她……
- 黑龙江伊春现受伤雄性东北虎 目前已被成功救治
- 概念区别 【编译型语言与解释型语言、动态类型语言与静态类型语言、强类型语言与弱类型语言】
- 支付宝小程序获取用户信息及手机号
- SYN6288中文语音合成 程序
- 运动补偿和运动估计总结(MEMC)
- 关于谷歌收购摩托罗拉移动的评论
热门文章
- 【医疗影像处理】脑部MRI影像denoise方法总结[antspy]
- 消防管件做的机器人图片_看图猜管件
- 树莓派 红灯不亮_关闭树莓派的电源指示灯和状态指示灯
- ashly理器4.8软件汉化版_工程造价专业 常用广联达CAD等软件 推荐什么笔记本电脑?...
- FJUT Home_W的gcd(乱搞)题解
- 第一次JAVA课,第一次课堂考,课后感受
- pycharm中tensorflow代码不能自动补全或import红线问题解决
- C++ Primer 笔记——嵌套类 局部类
- poj2182-Lost Cow
- Single Number leetcode java