Skip to Content

开发者日志:迈进SAP HANA世界的第一步

原文链接:https://www.experiencesaphana.com/community/blogs/blog/2012/03/05/developer-s-journal-first-steps-into-the-sap-hana-world

介绍

很久以前,当我第一次在SDN上写博客,我常常以开发者日志的风格来写。当时我为一个客户工作,因此我可以分享我在项目中的经验和学到的新技术。这一系列博文的目标是回到原来写作风格,但是是一个专注于探索全新的、令人兴奋的SAP HANA世界的旅程。

在今年年初,我转到了SAP HANA产品管理部门,负责SAP HANA的开发团队。我特别关注即将到来的SAP HANA的交易应用程序所需的开发工具和技术。我拥有主要工作于ERPABAP开发者背景;因此我的第一印象就是连系到我所了解的ABAP开发环境相关知识,从而开始分析HANA的研发如何改变了ABAP开发者的这么多的假设和方法。

向数据库更多地过渡

我为SAP HANA工作了几天之后的第一个想法是,我很有必要复习一下我的SQL技术。当然,我有很多SQL的经验,但是作为一个ABAP开发者,我们倾向于回避更深层的SQL有利于在ABAP的应用服务器上处理数据。当一名ABAP开发者读到这里的时候, 你最后一次在ABAP中使用子查询或联接是什么时候?或者说求和?作为ABAP开发者,我们很早就被教导要尽量将数据库抽象,而且我们倾向于相信我们有完全控制的应用服务器,而不是DBMS“黑盒”。这种情况在近几年日趋加剧,因为ABAP中有大量工具可以帮我们生成SQL

多年来这种方式很好的服务于ABAP开发者。我们可以把从外链接表中读取支持细节作为典型情况。在这种情况下,我们要从SFLIGHT里读取所有的航班信息,同时也从SCARR中读取承运人信息。在ABAP里,我们当然可以写一个内联接:

https://www.experiencesaphana.com/servlet/JiveServlet/downloadImage/38-1228-1293/620-272/ABAP_Sample1.png

然而很多ABAP开发者会选择另一种方式,就是在应用服务器的内存中通过内部表执行联接:

https://www.experiencesaphana.com/servlet/JiveServlet/downloadImage/38-1228-1294/569-223/ABAP_Sample2.png

当结合ABAP表缓存的概念来看,这种方式特别有益。要记住,这里我是在比较开发者的设计模式,而不是我这个特例的实际技术优点。在我的系统上,数据集不大,不足以证明这两种方式之间有统计上相关的性能差别。

现在如果我们把SAP HANA放进来,开发者将如何改变做法?在HANA中,开发者应该努力把处理推向数据库,但是问题可能是为什么?

https://www.experiencesaphana.com/servlet/JiveServlet/downloadImage/38-1228-1295/620-251/HANA_Sample1.png

HANA很大程度被关注的是它是基于内存的数据库。我想这是大多数开发者都能显而易见的一种优势,那就是相对于较慢的基于磁盘的存储来说,所有数据存在于高速的内存中。然而,如果仅仅是这一点优势,我们无法看到它跟ABAP处理的区别。毕竟ABAP可以整个表缓存。忽略更新的成本,如果我们缓存SFLIGHT表和SCARR表,我们的ABAP表循环联接会非常快,但是这还是没有HANA快。

另一个HANA架构的关键点是,除了基于内存,它还设计成列存储,以及并行处理。在ABAP表循环中,表中的每条记录在同一时间都会被顺序处理一次。这些现有版本的ABAP语句没有设计成并行处理。取而代之,ABAP通过在独立的工作流程里运行不同的用户会话来权衡多核/处理器。另一方面,HANA有潜力在一个请求里并行数据块。数据全部在内存中的事实,只会通过更有效地访问多处理器从而进一步支持并行操作,因为数据可以被“喂”给处理器,达到更快。毕竟并行不会有效,如果处理器在处理周期里花了大部分时间去等处理数据。

另一个技术方面的发挥是SAP HANA的列存储框架。如果一个表是列存储的,单个列的所有数据都存储在内存中。行存储(就如ABAP内部表的处理),把数据放在内存的一行中。

这意味着,由于这样的数据安排,对于联接条件每个表中的CARRID列可以被更快的扫描。扫描在内存中不需要的数据几乎没有成本,但是在磁盘上同样的操作就需要成本(因为磁盘需要等待盘片转动)。列方式存储数据可以减少扫描一列或多列的操作成本,以及优化压缩程序。

由于这些原因,开发者(特别是ABAP开发者)会开始重新考虑他们的应用程序设计。虽然SAP已经发表了关于在ERP里使用SAP HANA作为数据库的言论,但是为了最大化的体现HANA优势,我们也需要更多地将处理从ABAP推到数据库。这意味着ABAP开发者要写更多的SQL语句而且跟底层数据库有更频繁的交互。数据库不再是被最小化和抽象化的“bit bucket”,而是开发者的开发工具组中的另一种可以被充分利用的工具。甚至HANA的开发者工具和ABAP会更紧密联系(但这是另一个话题)。

随着脑中这个方向的改变,我这周开始读一些关于SQL的书。我想在除了典型ABAP环境之外提高我的SQL技能,同时更新我对SQL所能做的事情的印象,而我可能有几年没有碰了。现在我在读Alan Beaulieu写的O’Reilly Learning SQL 2nd Edition。我发现我可以一整天学习SQL规范,但是重建练习让我真的用到并且考虑到SQL的用途。我现在读的书,所罗列的所有SQL例子实际上都是根据MySQL格式的。这个练习更有趣的一个方面是,将这些练习整合到SAP HANA中,而更重要的是通过列存储和内存存储可以优化其中一部分的性能。我想我实际上通过调整例子可以看到更多方面并且学到更多。

下一步是什么

实际上HANA还有很多地方可以探索,而我现在还说不上来。当学习基础和将未来的ABAP开发与HANA结合到一起的同时,我也在做功能性开发,这还处于发展初期。也就是说,我以后会在博客里尽可能的分享我所知的。在下一期中,我将把重点放在我的下一个任务:探索SQLScript

To report this post you need to login first.

2 Comments

You must be Logged on to comment or reply to a post.

Leave a Reply