在我开始之前,道歉一下:
本博客文章,试图纠正我在以前的关于SAP HANA微博中的一个被很多次引用的错误。我说HANA是“或者是面向列或面向行”。正确的是面向行<it>和</it>列。错误的是非黑即白的论断。 “大卫,你知道没有一种魔杖你可以的只是挥手就能掌控它,”原来的设计师之一告诉我。 “这没有那么简单。”
然后,在这一块,我硬着头皮,并解释它是如何“真正”工作的,那就是,一个单一的数据库,包含行和列的表,如何既行面向<it>,又</it>列面向?
首先, HANA的是一个数据库。在数据库中,有表。表基本上是空白的空间,在那里你可以载入记录的字段集合。在面向行的数据库,表中的每一行包含一个记录,记录中的每个领域中占有的空间,即使是没有实际数据。
下面是一个例子。想象一个家庭地址表,其中包含一些人的姓氏,街道,城市,电话号码。 (每个被称为一个字段。)在一个面向行的表,填好表将包含很多行(或“行”),为每个地址。每行包含所有的值,但如果,例如,你没有一个电话号码,电话号码的空间将被留空。
在面向列的表,每个领域都占据一个单独的列。当你载入一个地址,你不要在同一行载入所有信息。你只需要添加任何需要的值。所以假使你只要姓氏“姓”一栏,全市“城市”一栏,别的就不必添加。
那么,面向列的表如何知道数据实际上是“属于”你加载的某些其他值吗? (技术术语是“纪录”。),基本上handwaving警报!每个值有一个标签,有另外一张表,你用标签去查询这个值属于哪条记录。
你可以看到一个面向行的表更容易来了解概念,它像一个电子表格中的行,但一个面向列的表节省了更多的空间,事实证明,列存储下读取数据的速度也是很快的。
有关HANA有一篇非常有趣的文章(Sikka等,“高效的事务处理的SAP HANA的数据库 - 一列存储神话的终结”。),Sikka描写到,面向行的表是“写优化”和面向列表的“读优化,”这是公平的描述的两种表“的重要优势。使用行方式写数据。用列方式分析和读取数据。
大多数数据库选择他们打算如何操作。数据库中的所有表都将是面向行的,或所有数据库中的表要面向列。
但HANA不是的,一个表可以是面向行或面向列,由程序员(或数据设计)决定。
但是这还不是全部就是这么回事。因为,一个程序员,在HANA里面,选择行<it>或</it>列和别处是不一样的。在HANA中,如果您决定表是要面向列的,不一定放弃了写优化(行表擅长)。 HANA有一个内部系统面向列的表,允许你输入面向行的数据,然后推入列面向数据表,而不损害面向列的表的性能。
因此,HANA的是面向行的<it>和</>面向列。A:它允许你创建无论是面向行的表或面向列的表。 B.如果您创建面向列的表,面向列的表的数据录入有面向行的缓冲区,这是写优化,从而好像它是一个行的表。
写优化列
了解如何做到这一点是值得的,因为它给你一些洞察到HANA是如何使用内存。
图4。统一的概念表概述
来源:“高效的事务处理在SAP HANA的数据库 - ”Vishal Sikka等,页731-741。一列存储神话的终结。
HANA的列表可以像行存储有一个简单的理由:这是行存储。正如你从上图中可以看到,有一个缓冲区存储(L1),这是面向行的。数据到L1。
每隔一段时间,一个L1缓存有效地关闭,把它的数据插入到一个面向列的缓冲区(L2)。这涉及到典型的面向列的东西,其中的值添加到各自的列, 他们属于的记录被记在另一张表中。
每隔一段时间,关闭L2缓冲区,数据推到主存储区。
它首先把数据存储到“写优化”行存储(L1)。然后,它需要把数据结构重组,接着把数据推到了L2,这是面向列的。最后,它把数据推到主列存。
这个过程将是古怪拜占庭和缓慢的,如果它不是在内存中做(或并行做)。但由于L1和L2和最后一列存储都在内存中,所有的处理都是在内存中完成,它都可以在后台完成。因为L1和L2操作都比较小,他们的数据可以提供给其他数据库操作。
所以,举例来说,如果你运行一个列数据库查询,而同时另一些数据被添加,查询只检查L1和L2,以及主列存,因为L1和L2总是相对较小,查询在内存中完成,这样的性能开销很小。
你什么时候使用行或列:一个人的意见
你可以看到,为何我解释背后HANA的设计理念。 L1,L2写优化,bla,bla,如果你想知道它做什么这很重要。但很难把握,如果你只是想获得的想法。
“我是一个财务软件开发人员[他过去在海波龙的Essbase的工作,现正在SAP的EPM工作]在一个长期的柏拉图关系枯燥的算法,如”折旧“和”分配“;我咬咬牙想让基本的代数运算在关系型数据库中运作如飞,我在90年代转向列的存储概念并且永不回头。我通常总是从有异常长的文本开始(如描述的东西)。
“然而,即使在HANA的世界,这不是固定的因为文本分析的奇妙。”
所以,如果你对数据做计算,你使用列,如果你做其他事情,像存储文本,然后你使用行,除非你硬是不用。
这似乎够明确。
你什么时候使用列,行:另一个人的意见
我也问了Vijay Vijayasankar
HANA有行和列的存储方式,没有技术上面的限制,我的简单的规则是使用列存储,直到发觉是不对的。
“所有数据都将被存储在多个表,所以你还需要考虑你将如何join表。表现最差的是应用程序试图join行存储的表和列存储的表。
“有其他方面的限制,你不能建立一个列视图基于行表,在HANA动的时刻行表装入内存,查询需要时列表被加载到内存。
所以,当使用行的时候列的性能更好,你使用列的方式。
所以,有什么关系吗?
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
13 | |
11 | |
10 | |
9 | |
9 | |
7 | |
6 | |
5 | |
5 | |
5 |