数据库的方向 - 行vs列

简介: 转载请注明出处:@http://blog.csdn.net/gamer_gyt,Thinkagmer 撰写博主微博:http://weibo.com/234654758 (欢迎互撩)私人博客:http://blog.

转载请注明出处:@http://blog.csdn.net/gamer_gyt,Thinkagmer 撰写

博主微博:http://weibo.com/234654758 (欢迎互撩)

私人博客:http://blog.cyanscikit.top (尚在开发中)
Github
https://github.com/thinkgamer

 

写在前边的话

      我记得刚开始写博客的时候,由于自己才疏学浅,很多东西就是从网上照抄的,那个时候太年轻,一心追求所谓的访问量和排名,慢慢的随着知识的积累,开始认真的写每一篇博客,不为别的,只为追求自己心中最真实的感受

      慢慢的也不爱转载别人文章了,除非是好文,但是网上的文章实在是侵权太严重,但是难道读到下边的一篇好文章,没有波澜壮阔,只有悠游自得,让人很舒服,所以分享给大家,只想让更多的人看到这个文章

      原文:https://www.ibm.com/developerworks/community/blogs/IBMi/entry/database?lang=en

================================以下为转载==================================

 

      如果你是一位数据库专家的话,这篇博客可能帮不了你什么。

      如果你是一位IT人士,但对数据库技术只知其然的话,这篇博客会很适合你。

      如果你是非IT人士,又或者你是我的家人,谢谢你们的阅读,但是显然你应该去寻求更适合你的阅读材料。

      如此,可能会对此话题感兴趣的朋友已经减少了。看来你应该是这样一个人,你是非数据库领域的IT专家,但是你深知数据库的重要性,你可能非常想更多的了解一些当前IT界正在热烈讨论的数据库热门话题。

      我可以很坦率的告诉大家,虽然我在IBM i的很多个部门工作过,但是我并不是一个DB2的开发人员。所以我会定期的去DB2团队寻求一些聪明的数据库专家给我一些比较高级的数据库指导。尤其,我非常想知道,为什么近来如此多行业都在谈论“列式存储”数据库的原因。所以,我找到了Mark Anderson。 众所周知,Mark是一位杰出的工程师,现在是DB2 for i的首席架构师。下面,我将分享一下我学到的知识。

      今天的主题也如同很多有关数据库讨论一样主要集中于性能方面。即,新兴的列式数据库和传统的行式数据库在性能方面的比较。

      顾名思义,这两种数据库架构在存贮数据时的方式是大相径庭的。在行式数据库中,每一行中的每一块数据都是紧挨着另一块数据存放在硬盘中。一般情况下,你可以认为每一行存贮的内容就是硬盘中的一组连续的字节。如果你记得DB 101(你已经学习了数据库的介绍课程,对吧?)中介绍的数据库中每一行都是用来记录一些实体信息的。为了方便我们的讨论,我们假设每一行都包含一个用户的信息,每个用户的所有属性都整块儿存储在硬盘上。如下图所示,虚拟表(或者数组)中的列用来存储每个属性                                          

        在硬盘上,大量的页面用来存储所有的数据。我们假设数据库中的每一行的信息都存储在同一页上。在这种情况 下,每一页都能保存一个用户的所有信息。在上边的例子中,Alice的所有信息都存储在一个页面中。如果需要获取或更新Alice的信息,那么某一时刻在内存中仅需存储关于Alice的单一页面。     

                                                                             

        虽然我还没有提到,但是你可以想象,如果是基于列的数据库,所有的数据都是以列的形式存储的。回到之前的例子,假设每一列的存储对应一个页面。如下图所示,所有的ZIP code将会存储到一个页面中,而所有的“2013 Total Order”则会存储在另一个页面中。

      (嘿,所有数据库专家可能会就此停留,继而对用户的表设计提出意见,但抱歉,我并不是数据库架构师,这仅仅只是一个教学用例。)

        现在,我们言归正传。

所有的数据库(实际上是所有的运算),当它所需要的数据驻留在内存中时其工作速度是最快的。当然正常情况下,数据不会在内存中,它们会被放到别的地方,当数据库调用它们时,它们才会被放到内存中。所以,如果你使用的是行式数据库,那么你对一行数据进行操作时,数据库的性能会是最好的。在上面的例子中,仅一个页面被放到了内存中。(这只是一个示例,事实上,操作系统会带来不止一页的数据,稍后详细说明)

        另一方面,如果你的数据库是基于行的,但是你要想得到所有数据中,某一列上的数据来做一些操作,这就意味着你将花费时间去访问每一行,可你用到的数据仅是一行中的小部分数据。若此时你使用了列式的数据库,那就可以方便快捷的获取数据,因为每一列的信息都是存储在一起的。例如,所有的“2013 Total Order”信息都是存储在同一列中的。

        可关键在于你使用列式数据库时,当你想要得到Alice的所有信息时,你又必须要读取大量的列(页面)来获取所有的数据。

       正因为此,才有了这些天有关列式数据库的讨论。

       如果你还是没有很好理解的话,我们下面会有更加详细的介绍。

       到目前为止,几乎所有的数据库都是基于行的数据库,此类数据库对大多数的传统业务都是非常有效的。数据库专家们将大部分的数据库工作负载称为OLTP--在线事务处理。OLTP工作负载是数据库现有业务的关键业务。一般而言,这些应用程序在使用行数据库时会有更好的表现,因为其工作负载趋向于单一实体的多个属性(存储在很多的列中)。由于这些应用程序都是基于行工作的,所以在使用时,从硬盘中获取的页面数量是最小的。

      如果能对列中的数据进行有效的处理,某些工作负载会运行得更高效。在线分析处理(OLAP)工作负载常常需要收集列中的数据。例如,如果你想要知道标记为“2013Total Order”列中的所有值,当你使用基于列的数据库时,你可以将这一列放到内存中并统计所有值。但当使用的是基于行的数据库时,就必须去访问每一行而获取对应的数据。

      当然,事实并非如此。基于行的数据库,例如DB2 for i,已经增加了一些方法,这些方法可以使得,诸如“sum a column”这样简单的操作,或者更复杂一些的OLAP分析也可以很高效的得到处理。例如,DB2 for i有两种结构,分别是编码向量索引(EVIs)和物化查询表(MQTs),对于这样的操作都有很好的效果。并且DB2 for i给用户的数据是成批的(一次读取很多行),而不是一次一个。除此之外,用户自定义的方法也可以用来提高性能。IBM的存储管理组件也是非常智能的,值得一提的是,它实现了单级存储。正因为它如此的智能,所以在用户提出请求前,已经将数据读取到内存中。正因为在很多的OLTP工作负载中都要求顺序地通过行,而DB2 for i在需要数据之前,已将行数据批量的读取到内存中,可见这个功能是非常重要的。

        另一方面,单纯给列式存储的表加索引,也不能使OLTP很高效。Mark曾经说过“这就像把很多的矮胖子放在一起”。行信息分散在很多存储页中。即使整个数据库都存放在内存里,也需要消耗大量的CPU资源,来将一行中的所有列拼接起来。

        下面总结这一课的关键内容。在选择使用哪种数据库时,问自己这样一个问题,哪种工作负载是你的数据库需要支持的最关键的工作负载。尽管可能你两种操作都需要,但是当核心业务是OLTP时,一个行式的数据库,再加上数十年积累的优化操作,可能是最好的选择。如果你的企业并不需要快速处理OLTP业务,但需要可以快速处理OLAP时,那么一个列式的数据库将会成为你的不二选择。

        如果你需要同时处理两种业务,且要求它们都能高效处理时,可以去了解两种种架构相关的混合技术。你可以选择一种,又或者是使用两种架构的结合来满足你的需求。无论你选择了何种类别,都要确保证这一解决方案是稳定的,这可是要用来切实为企业数据服务的。

       到此,尊敬的读者们, DB 102就结束了.现在,当你再读到有关列式数库的文章时,就可以理解其引起讨论的原因了。

       在下次的讨论中,我们将进一步学习。

       原文作者:Steve Will       

       翻译:周松文

 


相关文章
|
6月前
|
SQL 存储 NoSQL
SQL vs. NoSQL:如何根据大数据需求选择合适数据库
【4月更文挑战第8天】本文对比分析了SQL与NoSQL数据库在大数据项目中的应用。SQL数据库适合结构化数据、强一致性和复杂事务处理,如金融系统,而NoSQL则适用于半结构化和非结构化数据、高并发及大数据场景,如社交网络。选择时应考虑业务需求、技术栈、团队经验和成本效益,以找到最佳解决方案。随着技术发展,NewSQL和Multi-model数据库也提供了更多选择。
380 0
|
6月前
|
存储 NoSQL 数据库
数据库从0到0.1 (一): LSM-Tree VS B-Tree
数据库从0到0.1 (一): LSM-Tree VS B-Tree
94 0
|
5月前
|
存储 SQL BI
毫秒级查询性能优化实践!基于阿里云数据库 SelectDB 版内核:Apache Doris 在极越汽车数字化运营和营销方向的解决方案
毫秒级查询性能优化实践!基于阿里云数据库 SelectDB 版内核:Apache Doris 在极越汽车数字化运营和营销方向的解决方案
毫秒级查询性能优化实践!基于阿里云数据库 SelectDB 版内核:Apache Doris 在极越汽车数字化运营和营销方向的解决方案
|
14天前
|
存储 关系型数据库 MySQL
MySQL vs. PostgreSQL:选择适合你的开源数据库
在众多开源数据库中,MySQL和PostgreSQL无疑是最受欢迎的两个。它们都有着强大的功能、广泛的社区支持和丰富的生态系统。然而,它们在设计理念、性能特点、功能特性等方面存在着显著的差异。本文将从这三个方面对MySQL和PostgreSQL进行比较,以帮助您选择更适合您需求的开源数据库。
61 4
|
3月前
|
SQL 数据库 Java
HQL vs SQL:谁将统治数据库查询的未来?揭秘Hibernate的神秘力量!
【8月更文挑战第31天】Hibernate查询语言(HQL)是一种面向对象的查询语言,它模仿了SQL的语法,但操作对象为持久化类及其属性,而非数据库表和列。HQL具有类型安全、易于维护等优点,支持面向对象的高级特性,内置大量函数,可灵活处理查询结果。下面通过示例对比HQL与SQL,展示HQL在实际应用中的优势。例如,HQL查询“从员工表中筛选年龄大于30岁的员工”只需简单地表示为 `FROM Employee e WHERE e.age > 30`,而在SQL中则需明确指定表名和列名。此外,HQL在处理关联查询时也更为直观易懂。然而,对于某些复杂的数据库操作,SQL仍有其独特优势。
57 0
|
6月前
|
人工智能 数据管理 大数据
阿里云数据库走向Serverless与AI驱动的一站式数据平台是一个很有前景和意义的发展方向
阿里云数据库走向Serverless与AI驱动的一站式数据平台是一个很有前景和意义的发展方向
100 2
|
3月前
|
关系型数据库 MySQL 数据库
探究数据库开源协议:PostgreSQL vs MySQL
探究数据库开源协议:PostgreSQL vs MySQL
|
5月前
|
存储 缓存 分布式数据库
数据库性能优化方向的三大类别
【6月更文挑战第6天】本文介绍了数据库优化策略,包括集中式数据库的反规范化设计(如增加冗余列、派生列、重组合表、水平和垂直分表)和数据一致性保障;这些方法旨在提升性能、确保数据安全和适应大规模数据场景。
138 1
数据库性能优化方向的三大类别
|
5月前
|
分布式计算 大数据 数据处理
MaxCompute操作报错合集之odps数据库T1有几百行的数据,为什么出来只有5行的数据
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。
|
5月前
|
数据库 关系型数据库 索引
通过实例理解数据库性能优化的方向
【6月更文挑战第3天】性能优化是提升用户体验的关键,尤其是对数据库的优化。慢速数据库可能导致页面加载延迟,造成用户流失。通过组合优化,可确保数据库高效运行,支持应用程序顺畅,提供无缝用户体验。
187 0
通过实例理解数据库性能优化的方向
下一篇
无影云桌面