最近看到一篇很好资料里面三訁两语配上几个图就把列式存储(Column-based Storage)讲明白了,牛啊!最喜欢的就是这种浅显易懂就把背景知识讲得明明白白而不是长篇大论的讲概念。
列式存储(Columnar or column-based)是相对于传统关系型数据库更新字段数据的行式存储(Row-basedstorage)来说的简单来说两者的区别就是如何组织表(翻译不好,直接抄原文了):
从上圖可以很清楚地看到行式存储下一张表的数据都是放在一起的,但列式存储下都被分开保存了所以它们就有了如下这些优缺点:
? 查詢时只有涉及到的列会被读取 ? 任何列都能作为索引 |
|
? 选择完成时,被选择的列要重新组装 |
刚才其实跳过了资料里提到的另一种技术:通過字典表压缩数据为了方面后面的讲解,这部分也顺带提一下了
下面中才是那张表本来的样子。经过字典表进行数据压缩后表中的芓符串才都变成数字了。正因为每个字符串在字典表里只出现一次了所以达到了压缩的目的(有点像规范化和非规范化Normalize和Denomalize)
下面就是最牛的圖了,通过一条查询的执行过程说明列式存储(以及数据压缩)的优点:
-
去字典表里找到字符串对应数字(只进行一次字符串比较)
-
用数字去列表里匹配,匹配上的位置设为1
-
把不同列的匹配结果进行位运算得到符合所有条件的记录下标。
-
使用这个下标组装出最终的结果集
从Dremel和Impala嘚学习引申出了SQL查询的并行执行问题,于是借此机会深入学习一下关系数据库更新字段数据以及关系代数的并行计算
Speedup指用两倍的硬件换來一半的执行时间。Scaleup指两倍的硬件换来同等时间内执行两倍的任务但往往事情不是那么简单,两倍的硬件也会带来其他问题:更多CPU带来嘚长启动时间和通信开销以及并行计算带来的数据倾斜问题。
共享内存:任意CPU都能访问任意的内存(全局共享)和磁盘优点是简单,缺点昰扩展性差可用性低。
共享磁盘:任意CPU都能访问任何的磁盘但是只能访问自己的主存。优点是可用性和扩展性比较好缺点是实现复雜以及潜在的性能问题。
不共享:任意CPU都只能访问自己的主存和磁盘优点也是扩展性和可用性,缺点是实现复杂以及复杂均衡
混合型:系统整体上是shared nothing架构,但结点内部可能是其他架构这样就混合了多种架构的优点。
数据分区的目的就是:让数据库更新字段数据能够并荇地读写数据最大程度地挖掘I/O的潜力。常见的分区算法有:round-robin、范围索引、哈希
关系代数自身的属性允许关系操作的并行化。
并行查询處理主要分为四步:
? 翻译:将关系代数表达式翻译成查询树
? 优化:重排join顺序,并选择不同join算法来最小化执行开销
? 并行:将查询樹转换成物理操作树,并加载到处理器
? 执行:并行运行最终的执行计划。
首先将一条SQL语句翻译成查询树
然后根据表大小、索引等情況,重新排列join顺序并选择合适的算法。
关于join算法常见的有以下几种:
? Nested Loop join:思路很简单,相当于两层循环遍历外层是驱动表,返回满足关联条件的行适用于驱动表小(经过条件过滤后),而被驱动表上join字段有索引的情况在两表都很大时效率很差。
? Sort-merge join:思路也很简单就昰按join字段排序,然后进行归并排序当join字段存在重复值时,相当于每个重复值形成了一个分区Join字段是否排序和重复值的多少决定了sort-merge的效率。适用于两表都很大的情况尤其当join字段上存在聚集索引时(相当于已经排好序了),效率很高算法主要消耗在磁盘上。
? Hash join:类似于存在偅复值情况时的sort-merge只不过是人为的使用哈希函数进行分区。思路是扫描小表建立哈希表(build阶段小表也叫build表),然后逐行扫描大表进行比较(probe阶段大表也叫probe表)。适用于两表都很大又没有索引的情况限制是只适用于等值连接。算法主要消耗在CPU上
最后将查询树变成物理操作树,吔就是真正的执行计划然后根据集群的资源情况,调度到合适的结点上进行并行计算
昨天跟一同事讨论Sybase是不是关系型数据库更新字段數据,同事说Sybase是列式存储应该属于NoSQL,我一直的记忆Sybase是关系型数据库更新字段数据后来专门去查了资料,才发现同事所说的Sybase IO是列式存储;洏我说的是Sybase SQL Server是关系型数据库更新字段数据。网上看到这篇文章算是对几种数据库更新字段数据模型补补课。
数据库更新字段数据市场需要细分行式数据库更新字段数据不再满足所有的需求,而有很多需求需要通过本内存数据库更新字段数据和列式数据库更新字段数据解决列式数据库更新字段数据在数据分析、海量存储、BI这三个领域有自己独到。
定义:关系模型使用记录(行或者元祖)进行存储记錄存储在表中,表由架构界定表中的每个列都有名称和类型,表中的所有记录都要符合表的定义SQL是专门的查询语言,提供相应的语法查找符合条件的记录如表联接(Join)。表联接可以基于表之间的关系在多表之间查询记录
存储格式:行式数据库更新字段数据把一行中嘚数据值串在一起存储起来,然后再存储下一行的数据以此类推。
特点:据以行相关的存储体系架构进行空间分配主要适合与小批量嘚数据处理,常用于联机事务型数据处理不能满足后面三个需求:对数据库更新字段数据高并发读写要求,对海量数据的高效率存储和訪问需求对数据库更新字段数据高可扩展性和高可用性。 一句话不适合分布式、高并发和海量
定义:什么是列式数据库更新字段数据?列式数据库更新字段数据是以列相关存储架构进行数据存储的数据库更新字段数据。列式存储以流的方式在列中存储所有的数据主要适匼与批量数据处理和即席查询。
列式数据库更新字段数据把一列中的数据值串在一起存储起来然后再存储下一列的数据,以此类推
特點:包括查询快,由于查询需要读取的blocks少;数据压缩比高正因为同一类型的列存储在一起。Load快 简化数据建模的复杂性。但是插入更新慢不太适合数据老是变化,它是按列存储的这时候你就知道它适做DSS(决策支持系统),BI的优秀选择数据集市,数据仓库它不适合OLTP。
具体请参考如下地址:.
即Key-Value存储简称KV存储。它是NoSQL存储的一种方式它的数据按照键值对的形式进行组织,索引和存储KV存储非常适合不涉忣过多数据关系业务关系的业务数据,同时能有效减少读写磁盘的次数比SQL数据库更新字段数据存储拥有更好的读写性能。
典型例子 Sorted String Table即SSTable其实STL 库中map和hash_map, JAVA中hash_table, hash_map就是键值存储。 但是他们值只支持内存操作而且map的查询效率太低,关键是他们只是简单的数据结构不能实现较大规模存儲和分布式,而且数据的修改效率比较低。 而SSTalbe就解决了这些问题
键值存储实际是分布式表格系统的一种。
注:其实Hbase也属于列式存储
文档存儲支持对结构化数据的访问不同于关系模型的是,文档存储没有强制的架构
事实上,文档存储以封包键值对的方式进行存储在这种凊况下,应用对要检索的封包采取一些约定或者利用存储引擎的能力将不同的文档划分成不同的集合,以管理数据
与关系模型不同的昰,文档存储模型支持嵌套结构例如,文档存储模型支持XML和JSON文档字段的“值”又可以嵌套存储其它文档。文档存储模型也支持数组和列值键
与键值存储不同的是,文档存储关心文档的内部结构这使得存储引擎可以直接支持二级索引,从而允许对任意字段进行高效查詢支持文档嵌套存储的能力,使得查询语言具有搜索嵌套对象的能力XQuery就是一个例子。MongoDB通过支持在查询中指定JSON字段路径实现类似的功能
MongoDB 对SQL 和ACID 支持的比较全面的数据库更新字段数据了。不过 比较多的还是介绍日志的采集和存储,小文件的分布式存储类似互联网微博应鼡的数据存储等方面的内容。
图形数据库更新字段数据存储顶点和边的信息有的支持添加注释。
图形数据库更新字段数据可用于对事物建模如社交图谱、真实世界的各种对象。IMDB(Internet MovieDatabase)站点的内容就组成了一幅复杂的图像演员与电影彼此交织在一起。
图形数据库更新字段數据的查询语言一般用于查找图形中断点的路径或端点之间路径的属性。Neo4j是一个典型的图形数据库更新字段数据