在今天的文章里,我想专门详细谈下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一个神奇的幻想。不要理解错了:我是的确很喜欢用这个新特性引入的发展潜能,但你如果想要充分用好它,就要理解这个特性内部是如何实现的。

感谢关注!

参考文章:

https://www.sqlpassion.at/archive/2014/03/25/the-illusion-of-updateable-clustered-columnstore-indexes/

可更新聚集列存储索引幻想相关推荐

  1. SQL Server 2014聚集列存储索引

    转发请注明引用和原文博客(http://www.cnblogs.com/wenBlog) 简介 之前已经写过两篇介绍列存储索引的文章,但是只有非聚集列存储索引,今天再来简单介绍一下聚集的列存储索引,也 ...

  2. Azure Synapse Analytics (Azure SQL DW)性能优化指南(1)——使用有序聚集列存储索引优化性能

    目录 (一)前言 (二)有序与无序聚集列存储索引 (三)查询性能 (四)数据加载性能 (五)减少段重叠 (六)在大型表中创建有序 CCI (六)实战案例 A. 检查有序列和序号: B. 若要更改列序号 ...

  3. 数据库索引统计信息不一致_列存储索引增强功能–克隆数据库中的索引统计信息更新

    数据库索引统计信息不一致 SQL Server was launched in 1993 on WinNT and it completed its 25-year anniversary recen ...

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

    SQL Server 2016新特性:列存储索引新特性 行存储表可以有一个可更新的列存储索引,之前非聚集的列存储索引是只读的. 非聚集的列存储索引支持筛选条件. 在内存优化表中可以有一个列存储索引,可 ...

  5. 消息 35371-聚集列存储索引

    sqlserver版本:2014   操作,对线上库库存表加CCI.  表:dbo.product 然后就收到开发的消息,被告知查询报错. 消息 35371,级别 16,状态 1,第 1 行 具有聚集 ...

  6. SQL Server中的列存储索引

    先决条件 (Prerequisite ) 通过理论和实践措施可以更好地解释与SQL Server 2012列存储索引有关的讨论. 因此,对于实际测量部分–我将使用AdventureWorksDW201 ...

  7. 行存储索引改换成列存储索引_列存储索引增强功能–数据压缩,估计和节省

    行存储索引改换成列存储索引 Data compression is required to reduce database storage size as well as improving perf ...

  8. SQL Server 2016 列存储索引功能增强

     列存储索引(columnstore index)在SQL Server 2012中已经引入,其带来性能提升的同时也有很多限制,比如对带有列存储索引的表进行INSERT, UPDATE和DELET ...

  9. 行存储索引改换成列存储索引_如何使用列存储索引来改善数据仓库登台环境

    行存储索引改换成列存储索引 My team and I were recently tasked with refactoring older data marts, particularly tho ...

  10. mysql按照列构建索引_列存储索引增强功能–在线和离线(重新)构建

    mysql按照列构建索引 In this article, we will explore ' Clustered columnstore online index build and rebuild ...

最新文章

  1. Android零碎知识点-更新中
  2. 如何为JBoss Developer Studio 8设置集成和SOA工具
  3. AMD Mantle再添新作,引发下代GPU架构猜想
  4. redis的多路复用是什么鬼
  5. 江陵中学2021高考成绩查询,2021高考序幕拉开 荆州38080名考生赴考
  6. 湖北大学计算机科学与技术怎么样,湖北大学(专业学位)计算机技术考研难吗
  7. 40行代码教你利用Python网络爬虫批量抓取小视频
  8. nand linux bbt存储,Linux NAND BBT管理
  9. MTK 驱动(38)---MTK 待机问题分析
  10. 重读模式与架构(2)——层次划分的依据和角色职责
  11. 十二、实战底部(二)
  12. Oprofile工具的使用
  13. 微信小程序开发调用接口
  14. 工业物联网与人工智能合体之后 竟把魔爪第一个伸向了她……
  15. 黑龙江伊春现受伤雄性东北虎 目前已被成功救治
  16. 概念区别 【编译型语言与解释型语言、动态类型语言与静态类型语言、强类型语言与弱类型语言】
  17. 支付宝小程序获取用户信息及手机号
  18. SYN6288中文语音合成 程序
  19. 运动补偿和运动估计总结(MEMC)
  20. 关于谷歌收购摩托罗拉移动的评论

热门文章

  1. 【医疗影像处理】脑部MRI影像denoise方法总结[antspy]
  2. 消防管件做的机器人图片_看图猜管件
  3. 树莓派 红灯不亮_关闭树莓派的电源指示灯和状态指示灯
  4. ashly理器4.8软件汉化版_工程造价专业 常用广联达CAD等软件 推荐什么笔记本电脑?...
  5. FJUT Home_W的gcd(乱搞)题解
  6. 第一次JAVA课,第一次课堂考,课后感受
  7. pycharm中tensorflow代码不能自动补全或import红线问题解决
  8. C++ Primer 笔记——嵌套类 局部类
  9. poj2182-Lost Cow
  10. Single Number leetcode java